{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "2a845c62-71a5-4ca8-9d33-1e8518087d05",
   "metadata": {},
   "source": [
    "# homework"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1d410e32-d007-444c-bb78-c5ac42e9fc0a",
   "metadata": {},
   "source": [
    "### 使用决策树和 KNN 对 wine 的数据进行分类得到准确率，画出决策树结构图。使用 Kmeans 对 wine 数据进行聚类，并绘制簇中心。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "ffbb37cc-38b6-4a7c-9af8-173ab4273fa2",
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "from sklearn import tree\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "50795a6d-6d6d-4185-8fee-dc38c33e382d",
   "metadata": {},
   "outputs": [],
   "source": [
    "data = pd.read_csv('wine.txt',header=None)\n",
    "X=data.iloc[:,1:].values\n",
    "y=data.iloc[:,0].values"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "f3155576-5fae-4839-bda2-3fa7e614ca92",
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.preprocessing import MinMaxScaler\n",
    "\n",
    "scaler = MinMaxScaler()\n",
    "X = scaler.fit_transform(X)\n",
    "X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.2,random_state=123456)  "
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8417535e-3017-4df0-844a-bad7f42e4dae",
   "metadata": {},
   "source": [
    "## KNN"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "71516d72-829c-4dc9-a234-896904a1766e",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<style>#sk-container-id-1 {\n",
       "  /* Definition of color scheme common for light and dark mode */\n",
       "  --sklearn-color-text: black;\n",
       "  --sklearn-color-line: gray;\n",
       "  /* Definition of color scheme for unfitted estimators */\n",
       "  --sklearn-color-unfitted-level-0: #fff5e6;\n",
       "  --sklearn-color-unfitted-level-1: #f6e4d2;\n",
       "  --sklearn-color-unfitted-level-2: #ffe0b3;\n",
       "  --sklearn-color-unfitted-level-3: chocolate;\n",
       "  /* Definition of color scheme for fitted estimators */\n",
       "  --sklearn-color-fitted-level-0: #f0f8ff;\n",
       "  --sklearn-color-fitted-level-1: #d4ebff;\n",
       "  --sklearn-color-fitted-level-2: #b3dbfd;\n",
       "  --sklearn-color-fitted-level-3: cornflowerblue;\n",
       "\n",
       "  /* Specific color for light theme */\n",
       "  --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, white)));\n",
       "  --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-icon: #696969;\n",
       "\n",
       "  @media (prefers-color-scheme: dark) {\n",
       "    /* Redefinition of color scheme for dark theme */\n",
       "    --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, #111)));\n",
       "    --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-icon: #878787;\n",
       "  }\n",
       "}\n",
       "\n",
       "#sk-container-id-1 {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 pre {\n",
       "  padding: 0;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 input.sk-hidden--visually {\n",
       "  border: 0;\n",
       "  clip: rect(1px 1px 1px 1px);\n",
       "  clip: rect(1px, 1px, 1px, 1px);\n",
       "  height: 1px;\n",
       "  margin: -1px;\n",
       "  overflow: hidden;\n",
       "  padding: 0;\n",
       "  position: absolute;\n",
       "  width: 1px;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-dashed-wrapped {\n",
       "  border: 1px dashed var(--sklearn-color-line);\n",
       "  margin: 0 0.4em 0.5em 0.4em;\n",
       "  box-sizing: border-box;\n",
       "  padding-bottom: 0.4em;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-container {\n",
       "  /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n",
       "     but bootstrap.min.css set `[hidden] { display: none !important; }`\n",
       "     so we also need the `!important` here to be able to override the\n",
       "     default hidden behavior on the sphinx rendered scikit-learn.org.\n",
       "     See: https://github.com/scikit-learn/scikit-learn/issues/21755 */\n",
       "  display: inline-block !important;\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-text-repr-fallback {\n",
       "  display: none;\n",
       "}\n",
       "\n",
       "div.sk-parallel-item,\n",
       "div.sk-serial,\n",
       "div.sk-item {\n",
       "  /* draw centered vertical line to link estimators */\n",
       "  background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));\n",
       "  background-size: 2px 100%;\n",
       "  background-repeat: no-repeat;\n",
       "  background-position: center center;\n",
       "}\n",
       "\n",
       "/* Parallel-specific style estimator block */\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel-item::after {\n",
       "  content: \"\";\n",
       "  width: 100%;\n",
       "  border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n",
       "  flex-grow: 1;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel {\n",
       "  display: flex;\n",
       "  align-items: stretch;\n",
       "  justify-content: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel-item {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel-item:first-child::after {\n",
       "  align-self: flex-end;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel-item:last-child::after {\n",
       "  align-self: flex-start;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel-item:only-child::after {\n",
       "  width: 0;\n",
       "}\n",
       "\n",
       "/* Serial-specific style estimator block */\n",
       "\n",
       "#sk-container-id-1 div.sk-serial {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "  align-items: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  padding-right: 1em;\n",
       "  padding-left: 1em;\n",
       "}\n",
       "\n",
       "\n",
       "/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is\n",
       "clickable and can be expanded/collapsed.\n",
       "- Pipeline and ColumnTransformer use this feature and define the default style\n",
       "- Estimators will overwrite some part of the style using the `sk-estimator` class\n",
       "*/\n",
       "\n",
       "/* Pipeline and ColumnTransformer style (default) */\n",
       "\n",
       "#sk-container-id-1 div.sk-toggleable {\n",
       "  /* Default theme specific background. It is overwritten whether we have a\n",
       "  specific estimator or a Pipeline/ColumnTransformer */\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "/* Toggleable label */\n",
       "#sk-container-id-1 label.sk-toggleable__label {\n",
       "  cursor: pointer;\n",
       "  display: block;\n",
       "  width: 100%;\n",
       "  margin-bottom: 0;\n",
       "  padding: 0.5em;\n",
       "  box-sizing: border-box;\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 label.sk-toggleable__label-arrow:before {\n",
       "  /* Arrow on the left of the label */\n",
       "  content: \"▸\";\n",
       "  float: left;\n",
       "  margin-right: 0.25em;\n",
       "  color: var(--sklearn-color-icon);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 label.sk-toggleable__label-arrow:hover:before {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "/* Toggleable content - dropdown */\n",
       "\n",
       "#sk-container-id-1 div.sk-toggleable__content {\n",
       "  max-height: 0;\n",
       "  max-width: 0;\n",
       "  overflow: hidden;\n",
       "  text-align: left;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-toggleable__content.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-toggleable__content pre {\n",
       "  margin: 0.2em;\n",
       "  border-radius: 0.25em;\n",
       "  color: var(--sklearn-color-text);\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-toggleable__content.fitted pre {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 input.sk-toggleable__control:checked~div.sk-toggleable__content {\n",
       "  /* Expand drop-down */\n",
       "  max-height: 200px;\n",
       "  max-width: 100%;\n",
       "  overflow: auto;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n",
       "  content: \"▾\";\n",
       "}\n",
       "\n",
       "/* Pipeline/ColumnTransformer-specific style */\n",
       "\n",
       "#sk-container-id-1 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator-specific style */\n",
       "\n",
       "/* Colorize estimator box */\n",
       "#sk-container-id-1 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-label label.sk-toggleable__label,\n",
       "#sk-container-id-1 div.sk-label label {\n",
       "  /* The background is the default theme color */\n",
       "  color: var(--sklearn-color-text-on-default-background);\n",
       "}\n",
       "\n",
       "/* On hover, darken the color of the background */\n",
       "#sk-container-id-1 div.sk-label:hover label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "/* Label box, darken color on hover, fitted */\n",
       "#sk-container-id-1 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator label */\n",
       "\n",
       "#sk-container-id-1 div.sk-label label {\n",
       "  font-family: monospace;\n",
       "  font-weight: bold;\n",
       "  display: inline-block;\n",
       "  line-height: 1.2em;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-label-container {\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "/* Estimator-specific */\n",
       "#sk-container-id-1 div.sk-estimator {\n",
       "  font-family: monospace;\n",
       "  border: 1px dotted var(--sklearn-color-border-box);\n",
       "  border-radius: 0.25em;\n",
       "  box-sizing: border-box;\n",
       "  margin-bottom: 0.5em;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-estimator.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "/* on hover */\n",
       "#sk-container-id-1 div.sk-estimator:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-estimator.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Specification for estimator info (e.g. \"i\" and \"?\") */\n",
       "\n",
       "/* Common style for \"i\" and \"?\" */\n",
       "\n",
       ".sk-estimator-doc-link,\n",
       "a:link.sk-estimator-doc-link,\n",
       "a:visited.sk-estimator-doc-link {\n",
       "  float: right;\n",
       "  font-size: smaller;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1em;\n",
       "  height: 1em;\n",
       "  width: 1em;\n",
       "  text-decoration: none !important;\n",
       "  margin-left: 1ex;\n",
       "  /* unfitted */\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted,\n",
       "a:link.sk-estimator-doc-link.fitted,\n",
       "a:visited.sk-estimator-doc-link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "div.sk-estimator:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "div.sk-estimator.fitted:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "/* Span, style for the box shown on hovering the info icon */\n",
       ".sk-estimator-doc-link span {\n",
       "  display: none;\n",
       "  z-index: 9999;\n",
       "  position: relative;\n",
       "  font-weight: normal;\n",
       "  right: .2ex;\n",
       "  padding: .5ex;\n",
       "  margin: .5ex;\n",
       "  width: min-content;\n",
       "  min-width: 20ex;\n",
       "  max-width: 50ex;\n",
       "  color: var(--sklearn-color-text);\n",
       "  box-shadow: 2pt 2pt 4pt #999;\n",
       "  /* unfitted */\n",
       "  background: var(--sklearn-color-unfitted-level-0);\n",
       "  border: .5pt solid var(--sklearn-color-unfitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted span {\n",
       "  /* fitted */\n",
       "  background: var(--sklearn-color-fitted-level-0);\n",
       "  border: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link:hover span {\n",
       "  display: block;\n",
       "}\n",
       "\n",
       "/* \"?\"-specific style due to the `<a>` HTML tag */\n",
       "\n",
       "#sk-container-id-1 a.estimator_doc_link {\n",
       "  float: right;\n",
       "  font-size: 1rem;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1rem;\n",
       "  height: 1rem;\n",
       "  width: 1rem;\n",
       "  text-decoration: none;\n",
       "  /* unfitted */\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 a.estimator_doc_link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "#sk-container-id-1 a.estimator_doc_link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 a.estimator_doc_link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "</style><div id=\"sk-container-id-1\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>KNeighborsClassifier()</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-1\" type=\"checkbox\" checked><label for=\"sk-estimator-id-1\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\">&nbsp;&nbsp;KNeighborsClassifier<a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.5/modules/generated/sklearn.neighbors.KNeighborsClassifier.html\">?<span>Documentation for KNeighborsClassifier</span></a><span class=\"sk-estimator-doc-link fitted\">i<span>Fitted</span></span></label><div class=\"sk-toggleable__content fitted\"><pre>KNeighborsClassifier()</pre></div> </div></div></div></div>"
      ],
      "text/plain": [
       "KNeighborsClassifier()"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.neighbors import KNeighborsClassifier\n",
    "\n",
    "# 实例化模型并训练\n",
    "model = KNeighborsClassifier()\n",
    "model.fit(X_train,y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "1c49de70-54d0-4faa-b482-f377765ecb55",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.9722222222222222\n",
      "              precision    recall  f1-score   support\n",
      "\n",
      "           1       1.00      1.00      1.00        11\n",
      "           2       1.00      0.94      0.97        17\n",
      "           3       0.89      1.00      0.94         8\n",
      "\n",
      "    accuracy                           0.97        36\n",
      "   macro avg       0.96      0.98      0.97        36\n",
      "weighted avg       0.98      0.97      0.97        36\n",
      "\n"
     ]
    }
   ],
   "source": [
    "# 方法1：直接使用模型的score方法计算正确率\n",
    "print(model.score(X_test,y_test))\n",
    "\n",
    "# 方法2：使用sklearn.metrics下的classification_report方法\n",
    "# 先对测试集进行预测\n",
    "y_pred = model.predict(X_test) #预测类别标签\n",
    "y_pred_prob = model.predict_proba(X_test) #预测类别概率\n",
    "\n",
    "# 分类评估报告classification_report\n",
    "from sklearn.metrics import classification_report\n",
    "print(classification_report(y_test,y_pred))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5af1427b-7d5b-4ee2-9d48-978993a13079",
   "metadata": {},
   "source": [
    "## 决策树 "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "6c241bfa-c0d7-4ff9-b8e2-27f14d560f88",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<style>#sk-container-id-2 {\n",
       "  /* Definition of color scheme common for light and dark mode */\n",
       "  --sklearn-color-text: black;\n",
       "  --sklearn-color-line: gray;\n",
       "  /* Definition of color scheme for unfitted estimators */\n",
       "  --sklearn-color-unfitted-level-0: #fff5e6;\n",
       "  --sklearn-color-unfitted-level-1: #f6e4d2;\n",
       "  --sklearn-color-unfitted-level-2: #ffe0b3;\n",
       "  --sklearn-color-unfitted-level-3: chocolate;\n",
       "  /* Definition of color scheme for fitted estimators */\n",
       "  --sklearn-color-fitted-level-0: #f0f8ff;\n",
       "  --sklearn-color-fitted-level-1: #d4ebff;\n",
       "  --sklearn-color-fitted-level-2: #b3dbfd;\n",
       "  --sklearn-color-fitted-level-3: cornflowerblue;\n",
       "\n",
       "  /* Specific color for light theme */\n",
       "  --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, white)));\n",
       "  --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-icon: #696969;\n",
       "\n",
       "  @media (prefers-color-scheme: dark) {\n",
       "    /* Redefinition of color scheme for dark theme */\n",
       "    --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, #111)));\n",
       "    --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-icon: #878787;\n",
       "  }\n",
       "}\n",
       "\n",
       "#sk-container-id-2 {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 pre {\n",
       "  padding: 0;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 input.sk-hidden--visually {\n",
       "  border: 0;\n",
       "  clip: rect(1px 1px 1px 1px);\n",
       "  clip: rect(1px, 1px, 1px, 1px);\n",
       "  height: 1px;\n",
       "  margin: -1px;\n",
       "  overflow: hidden;\n",
       "  padding: 0;\n",
       "  position: absolute;\n",
       "  width: 1px;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-dashed-wrapped {\n",
       "  border: 1px dashed var(--sklearn-color-line);\n",
       "  margin: 0 0.4em 0.5em 0.4em;\n",
       "  box-sizing: border-box;\n",
       "  padding-bottom: 0.4em;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-container {\n",
       "  /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n",
       "     but bootstrap.min.css set `[hidden] { display: none !important; }`\n",
       "     so we also need the `!important` here to be able to override the\n",
       "     default hidden behavior on the sphinx rendered scikit-learn.org.\n",
       "     See: https://github.com/scikit-learn/scikit-learn/issues/21755 */\n",
       "  display: inline-block !important;\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-text-repr-fallback {\n",
       "  display: none;\n",
       "}\n",
       "\n",
       "div.sk-parallel-item,\n",
       "div.sk-serial,\n",
       "div.sk-item {\n",
       "  /* draw centered vertical line to link estimators */\n",
       "  background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));\n",
       "  background-size: 2px 100%;\n",
       "  background-repeat: no-repeat;\n",
       "  background-position: center center;\n",
       "}\n",
       "\n",
       "/* Parallel-specific style estimator block */\n",
       "\n",
       "#sk-container-id-2 div.sk-parallel-item::after {\n",
       "  content: \"\";\n",
       "  width: 100%;\n",
       "  border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n",
       "  flex-grow: 1;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-parallel {\n",
       "  display: flex;\n",
       "  align-items: stretch;\n",
       "  justify-content: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-parallel-item {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-parallel-item:first-child::after {\n",
       "  align-self: flex-end;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-parallel-item:last-child::after {\n",
       "  align-self: flex-start;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-parallel-item:only-child::after {\n",
       "  width: 0;\n",
       "}\n",
       "\n",
       "/* Serial-specific style estimator block */\n",
       "\n",
       "#sk-container-id-2 div.sk-serial {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "  align-items: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  padding-right: 1em;\n",
       "  padding-left: 1em;\n",
       "}\n",
       "\n",
       "\n",
       "/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is\n",
       "clickable and can be expanded/collapsed.\n",
       "- Pipeline and ColumnTransformer use this feature and define the default style\n",
       "- Estimators will overwrite some part of the style using the `sk-estimator` class\n",
       "*/\n",
       "\n",
       "/* Pipeline and ColumnTransformer style (default) */\n",
       "\n",
       "#sk-container-id-2 div.sk-toggleable {\n",
       "  /* Default theme specific background. It is overwritten whether we have a\n",
       "  specific estimator or a Pipeline/ColumnTransformer */\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "/* Toggleable label */\n",
       "#sk-container-id-2 label.sk-toggleable__label {\n",
       "  cursor: pointer;\n",
       "  display: block;\n",
       "  width: 100%;\n",
       "  margin-bottom: 0;\n",
       "  padding: 0.5em;\n",
       "  box-sizing: border-box;\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 label.sk-toggleable__label-arrow:before {\n",
       "  /* Arrow on the left of the label */\n",
       "  content: \"▸\";\n",
       "  float: left;\n",
       "  margin-right: 0.25em;\n",
       "  color: var(--sklearn-color-icon);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 label.sk-toggleable__label-arrow:hover:before {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "/* Toggleable content - dropdown */\n",
       "\n",
       "#sk-container-id-2 div.sk-toggleable__content {\n",
       "  max-height: 0;\n",
       "  max-width: 0;\n",
       "  overflow: hidden;\n",
       "  text-align: left;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-toggleable__content.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-toggleable__content pre {\n",
       "  margin: 0.2em;\n",
       "  border-radius: 0.25em;\n",
       "  color: var(--sklearn-color-text);\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-toggleable__content.fitted pre {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 input.sk-toggleable__control:checked~div.sk-toggleable__content {\n",
       "  /* Expand drop-down */\n",
       "  max-height: 200px;\n",
       "  max-width: 100%;\n",
       "  overflow: auto;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n",
       "  content: \"▾\";\n",
       "}\n",
       "\n",
       "/* Pipeline/ColumnTransformer-specific style */\n",
       "\n",
       "#sk-container-id-2 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator-specific style */\n",
       "\n",
       "/* Colorize estimator box */\n",
       "#sk-container-id-2 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-label label.sk-toggleable__label,\n",
       "#sk-container-id-2 div.sk-label label {\n",
       "  /* The background is the default theme color */\n",
       "  color: var(--sklearn-color-text-on-default-background);\n",
       "}\n",
       "\n",
       "/* On hover, darken the color of the background */\n",
       "#sk-container-id-2 div.sk-label:hover label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "/* Label box, darken color on hover, fitted */\n",
       "#sk-container-id-2 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator label */\n",
       "\n",
       "#sk-container-id-2 div.sk-label label {\n",
       "  font-family: monospace;\n",
       "  font-weight: bold;\n",
       "  display: inline-block;\n",
       "  line-height: 1.2em;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-label-container {\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "/* Estimator-specific */\n",
       "#sk-container-id-2 div.sk-estimator {\n",
       "  font-family: monospace;\n",
       "  border: 1px dotted var(--sklearn-color-border-box);\n",
       "  border-radius: 0.25em;\n",
       "  box-sizing: border-box;\n",
       "  margin-bottom: 0.5em;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-estimator.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "/* on hover */\n",
       "#sk-container-id-2 div.sk-estimator:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-estimator.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Specification for estimator info (e.g. \"i\" and \"?\") */\n",
       "\n",
       "/* Common style for \"i\" and \"?\" */\n",
       "\n",
       ".sk-estimator-doc-link,\n",
       "a:link.sk-estimator-doc-link,\n",
       "a:visited.sk-estimator-doc-link {\n",
       "  float: right;\n",
       "  font-size: smaller;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1em;\n",
       "  height: 1em;\n",
       "  width: 1em;\n",
       "  text-decoration: none !important;\n",
       "  margin-left: 1ex;\n",
       "  /* unfitted */\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted,\n",
       "a:link.sk-estimator-doc-link.fitted,\n",
       "a:visited.sk-estimator-doc-link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "div.sk-estimator:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "div.sk-estimator.fitted:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "/* Span, style for the box shown on hovering the info icon */\n",
       ".sk-estimator-doc-link span {\n",
       "  display: none;\n",
       "  z-index: 9999;\n",
       "  position: relative;\n",
       "  font-weight: normal;\n",
       "  right: .2ex;\n",
       "  padding: .5ex;\n",
       "  margin: .5ex;\n",
       "  width: min-content;\n",
       "  min-width: 20ex;\n",
       "  max-width: 50ex;\n",
       "  color: var(--sklearn-color-text);\n",
       "  box-shadow: 2pt 2pt 4pt #999;\n",
       "  /* unfitted */\n",
       "  background: var(--sklearn-color-unfitted-level-0);\n",
       "  border: .5pt solid var(--sklearn-color-unfitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted span {\n",
       "  /* fitted */\n",
       "  background: var(--sklearn-color-fitted-level-0);\n",
       "  border: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link:hover span {\n",
       "  display: block;\n",
       "}\n",
       "\n",
       "/* \"?\"-specific style due to the `<a>` HTML tag */\n",
       "\n",
       "#sk-container-id-2 a.estimator_doc_link {\n",
       "  float: right;\n",
       "  font-size: 1rem;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1rem;\n",
       "  height: 1rem;\n",
       "  width: 1rem;\n",
       "  text-decoration: none;\n",
       "  /* unfitted */\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 a.estimator_doc_link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "#sk-container-id-2 a.estimator_doc_link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 a.estimator_doc_link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "</style><div id=\"sk-container-id-2\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>DecisionTreeClassifier(max_depth=10)</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-2\" type=\"checkbox\" checked><label for=\"sk-estimator-id-2\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\">&nbsp;&nbsp;DecisionTreeClassifier<a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.5/modules/generated/sklearn.tree.DecisionTreeClassifier.html\">?<span>Documentation for DecisionTreeClassifier</span></a><span class=\"sk-estimator-doc-link fitted\">i<span>Fitted</span></span></label><div class=\"sk-toggleable__content fitted\"><pre>DecisionTreeClassifier(max_depth=10)</pre></div> </div></div></div></div>"
      ],
      "text/plain": [
       "DecisionTreeClassifier(max_depth=10)"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.tree import DecisionTreeClassifier\n",
    "\n",
    "dtree = DecisionTreeClassifier(max_depth=10)\n",
    "dtree.fit(X_train,y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "612bf111-6684-4702-85b9-6269348153e7",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "DecisionTreeClassifier(criterion='entropy', max_depth=10)\n",
      "0.9364532019704435\n",
      "{'criterion': 'entropy', 'max_depth': 10}\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home1/xiaojiaying/.local/lib/python3.10/site-packages/numpy/ma/core.py:2881: RuntimeWarning: invalid value encountered in cast\n",
      "  _data = np.array(data, dtype=dtype, copy=copy,\n"
     ]
    }
   ],
   "source": [
    "# grid search调参\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "\n",
    "parameters = {\n",
    "    'criterion':['gini','entropy'],\n",
    "    'max_depth':[1,2,3,4,5,6,7,8,9,10,11,12]\n",
    "}\n",
    "\n",
    "dtree = tree.DecisionTreeClassifier()\n",
    "dtree_search = GridSearchCV(dtree, parameters, scoring='accuracy', cv=5)\n",
    "dtree_search.fit(X_train, y_train)\n",
    "\n",
    "#查看最佳结果\n",
    "print(dtree_search.best_estimator_)\n",
    "print(dtree_search.best_score_)\n",
    "print(dtree_search.best_params_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "26593141-0c87-4480-8f22-45e7d2f6caa6",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<style>#sk-container-id-3 {\n",
       "  /* Definition of color scheme common for light and dark mode */\n",
       "  --sklearn-color-text: black;\n",
       "  --sklearn-color-line: gray;\n",
       "  /* Definition of color scheme for unfitted estimators */\n",
       "  --sklearn-color-unfitted-level-0: #fff5e6;\n",
       "  --sklearn-color-unfitted-level-1: #f6e4d2;\n",
       "  --sklearn-color-unfitted-level-2: #ffe0b3;\n",
       "  --sklearn-color-unfitted-level-3: chocolate;\n",
       "  /* Definition of color scheme for fitted estimators */\n",
       "  --sklearn-color-fitted-level-0: #f0f8ff;\n",
       "  --sklearn-color-fitted-level-1: #d4ebff;\n",
       "  --sklearn-color-fitted-level-2: #b3dbfd;\n",
       "  --sklearn-color-fitted-level-3: cornflowerblue;\n",
       "\n",
       "  /* Specific color for light theme */\n",
       "  --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, white)));\n",
       "  --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-icon: #696969;\n",
       "\n",
       "  @media (prefers-color-scheme: dark) {\n",
       "    /* Redefinition of color scheme for dark theme */\n",
       "    --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, #111)));\n",
       "    --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-icon: #878787;\n",
       "  }\n",
       "}\n",
       "\n",
       "#sk-container-id-3 {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "#sk-container-id-3 pre {\n",
       "  padding: 0;\n",
       "}\n",
       "\n",
       "#sk-container-id-3 input.sk-hidden--visually {\n",
       "  border: 0;\n",
       "  clip: rect(1px 1px 1px 1px);\n",
       "  clip: rect(1px, 1px, 1px, 1px);\n",
       "  height: 1px;\n",
       "  margin: -1px;\n",
       "  overflow: hidden;\n",
       "  padding: 0;\n",
       "  position: absolute;\n",
       "  width: 1px;\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-dashed-wrapped {\n",
       "  border: 1px dashed var(--sklearn-color-line);\n",
       "  margin: 0 0.4em 0.5em 0.4em;\n",
       "  box-sizing: border-box;\n",
       "  padding-bottom: 0.4em;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-container {\n",
       "  /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n",
       "     but bootstrap.min.css set `[hidden] { display: none !important; }`\n",
       "     so we also need the `!important` here to be able to override the\n",
       "     default hidden behavior on the sphinx rendered scikit-learn.org.\n",
       "     See: https://github.com/scikit-learn/scikit-learn/issues/21755 */\n",
       "  display: inline-block !important;\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-text-repr-fallback {\n",
       "  display: none;\n",
       "}\n",
       "\n",
       "div.sk-parallel-item,\n",
       "div.sk-serial,\n",
       "div.sk-item {\n",
       "  /* draw centered vertical line to link estimators */\n",
       "  background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));\n",
       "  background-size: 2px 100%;\n",
       "  background-repeat: no-repeat;\n",
       "  background-position: center center;\n",
       "}\n",
       "\n",
       "/* Parallel-specific style estimator block */\n",
       "\n",
       "#sk-container-id-3 div.sk-parallel-item::after {\n",
       "  content: \"\";\n",
       "  width: 100%;\n",
       "  border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n",
       "  flex-grow: 1;\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-parallel {\n",
       "  display: flex;\n",
       "  align-items: stretch;\n",
       "  justify-content: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-parallel-item {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-parallel-item:first-child::after {\n",
       "  align-self: flex-end;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-parallel-item:last-child::after {\n",
       "  align-self: flex-start;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-parallel-item:only-child::after {\n",
       "  width: 0;\n",
       "}\n",
       "\n",
       "/* Serial-specific style estimator block */\n",
       "\n",
       "#sk-container-id-3 div.sk-serial {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "  align-items: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  padding-right: 1em;\n",
       "  padding-left: 1em;\n",
       "}\n",
       "\n",
       "\n",
       "/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is\n",
       "clickable and can be expanded/collapsed.\n",
       "- Pipeline and ColumnTransformer use this feature and define the default style\n",
       "- Estimators will overwrite some part of the style using the `sk-estimator` class\n",
       "*/\n",
       "\n",
       "/* Pipeline and ColumnTransformer style (default) */\n",
       "\n",
       "#sk-container-id-3 div.sk-toggleable {\n",
       "  /* Default theme specific background. It is overwritten whether we have a\n",
       "  specific estimator or a Pipeline/ColumnTransformer */\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "/* Toggleable label */\n",
       "#sk-container-id-3 label.sk-toggleable__label {\n",
       "  cursor: pointer;\n",
       "  display: block;\n",
       "  width: 100%;\n",
       "  margin-bottom: 0;\n",
       "  padding: 0.5em;\n",
       "  box-sizing: border-box;\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "#sk-container-id-3 label.sk-toggleable__label-arrow:before {\n",
       "  /* Arrow on the left of the label */\n",
       "  content: \"▸\";\n",
       "  float: left;\n",
       "  margin-right: 0.25em;\n",
       "  color: var(--sklearn-color-icon);\n",
       "}\n",
       "\n",
       "#sk-container-id-3 label.sk-toggleable__label-arrow:hover:before {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "/* Toggleable content - dropdown */\n",
       "\n",
       "#sk-container-id-3 div.sk-toggleable__content {\n",
       "  max-height: 0;\n",
       "  max-width: 0;\n",
       "  overflow: hidden;\n",
       "  text-align: left;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-toggleable__content.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-toggleable__content pre {\n",
       "  margin: 0.2em;\n",
       "  border-radius: 0.25em;\n",
       "  color: var(--sklearn-color-text);\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-toggleable__content.fitted pre {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-3 input.sk-toggleable__control:checked~div.sk-toggleable__content {\n",
       "  /* Expand drop-down */\n",
       "  max-height: 200px;\n",
       "  max-width: 100%;\n",
       "  overflow: auto;\n",
       "}\n",
       "\n",
       "#sk-container-id-3 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n",
       "  content: \"▾\";\n",
       "}\n",
       "\n",
       "/* Pipeline/ColumnTransformer-specific style */\n",
       "\n",
       "#sk-container-id-3 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator-specific style */\n",
       "\n",
       "/* Colorize estimator box */\n",
       "#sk-container-id-3 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-label label.sk-toggleable__label,\n",
       "#sk-container-id-3 div.sk-label label {\n",
       "  /* The background is the default theme color */\n",
       "  color: var(--sklearn-color-text-on-default-background);\n",
       "}\n",
       "\n",
       "/* On hover, darken the color of the background */\n",
       "#sk-container-id-3 div.sk-label:hover label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "/* Label box, darken color on hover, fitted */\n",
       "#sk-container-id-3 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator label */\n",
       "\n",
       "#sk-container-id-3 div.sk-label label {\n",
       "  font-family: monospace;\n",
       "  font-weight: bold;\n",
       "  display: inline-block;\n",
       "  line-height: 1.2em;\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-label-container {\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "/* Estimator-specific */\n",
       "#sk-container-id-3 div.sk-estimator {\n",
       "  font-family: monospace;\n",
       "  border: 1px dotted var(--sklearn-color-border-box);\n",
       "  border-radius: 0.25em;\n",
       "  box-sizing: border-box;\n",
       "  margin-bottom: 0.5em;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-estimator.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "/* on hover */\n",
       "#sk-container-id-3 div.sk-estimator:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-estimator.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Specification for estimator info (e.g. \"i\" and \"?\") */\n",
       "\n",
       "/* Common style for \"i\" and \"?\" */\n",
       "\n",
       ".sk-estimator-doc-link,\n",
       "a:link.sk-estimator-doc-link,\n",
       "a:visited.sk-estimator-doc-link {\n",
       "  float: right;\n",
       "  font-size: smaller;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1em;\n",
       "  height: 1em;\n",
       "  width: 1em;\n",
       "  text-decoration: none !important;\n",
       "  margin-left: 1ex;\n",
       "  /* unfitted */\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted,\n",
       "a:link.sk-estimator-doc-link.fitted,\n",
       "a:visited.sk-estimator-doc-link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "div.sk-estimator:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "div.sk-estimator.fitted:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "/* Span, style for the box shown on hovering the info icon */\n",
       ".sk-estimator-doc-link span {\n",
       "  display: none;\n",
       "  z-index: 9999;\n",
       "  position: relative;\n",
       "  font-weight: normal;\n",
       "  right: .2ex;\n",
       "  padding: .5ex;\n",
       "  margin: .5ex;\n",
       "  width: min-content;\n",
       "  min-width: 20ex;\n",
       "  max-width: 50ex;\n",
       "  color: var(--sklearn-color-text);\n",
       "  box-shadow: 2pt 2pt 4pt #999;\n",
       "  /* unfitted */\n",
       "  background: var(--sklearn-color-unfitted-level-0);\n",
       "  border: .5pt solid var(--sklearn-color-unfitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted span {\n",
       "  /* fitted */\n",
       "  background: var(--sklearn-color-fitted-level-0);\n",
       "  border: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link:hover span {\n",
       "  display: block;\n",
       "}\n",
       "\n",
       "/* \"?\"-specific style due to the `<a>` HTML tag */\n",
       "\n",
       "#sk-container-id-3 a.estimator_doc_link {\n",
       "  float: right;\n",
       "  font-size: 1rem;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1rem;\n",
       "  height: 1rem;\n",
       "  width: 1rem;\n",
       "  text-decoration: none;\n",
       "  /* unfitted */\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "}\n",
       "\n",
       "#sk-container-id-3 a.estimator_doc_link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "#sk-container-id-3 a.estimator_doc_link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "#sk-container-id-3 a.estimator_doc_link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "</style><div id=\"sk-container-id-3\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>DecisionTreeClassifier(criterion=&#x27;entropy&#x27;, max_depth=10)</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-3\" type=\"checkbox\" checked><label for=\"sk-estimator-id-3\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\">&nbsp;&nbsp;DecisionTreeClassifier<a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.5/modules/generated/sklearn.tree.DecisionTreeClassifier.html\">?<span>Documentation for DecisionTreeClassifier</span></a><span class=\"sk-estimator-doc-link fitted\">i<span>Fitted</span></span></label><div class=\"sk-toggleable__content fitted\"><pre>DecisionTreeClassifier(criterion=&#x27;entropy&#x27;, max_depth=10)</pre></div> </div></div></div></div>"
      ],
      "text/plain": [
       "DecisionTreeClassifier(criterion='entropy', max_depth=10)"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 用最佳参数重新训练模型\n",
    "dtree = DecisionTreeClassifier(criterion='entropy',max_depth=10)\n",
    "dtree.fit(X_train, y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "e01f614c-e361-44ec-98a2-1a08648cb9d3",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "              precision    recall  f1-score   support\n",
      "\n",
      "           1       1.00      1.00      1.00        11\n",
      "           2       1.00      1.00      1.00        17\n",
      "           3       1.00      1.00      1.00         8\n",
      "\n",
      "    accuracy                           1.00        36\n",
      "   macro avg       1.00      1.00      1.00        36\n",
      "weighted avg       1.00      1.00      1.00        36\n",
      "\n"
     ]
    },
    {
     "data": {
      "image/png": "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AACM4NYpx4JYlqUvvvhCmzZt0pkzZ9S2bVsNHTpUknTmzBmdP39edevWVWBgoFeKBQCgIB4H2q5du9S/f38dPHhQlmXJZrMpMzPTFWirVq3So48+qsWLF6tXr15eKxgAgPx4dMrx2LFj6tq1qw4cOKAePXrotdde068vxfXu3VvBwcH67LPPvFIoAACF8SjQXnnlFaWkpGj69OlaunSpfv/73+dpExYWpmbNmmnr1q03XCQAANfjUaCtWLFCDRs21KhRowptFx8fr+TkZI8KAwCgKDwKtBMnTqhJkybXbWez2eR0Oj1ZBQAAReJRoIWHh+vMmTPXbZeYmKhKlSp5sgoAAIrEo0Br0qSJtm3bprNnzxbY5siRI9q1a5datWrlcXEAALjLo0AbMGCAUlNT9fjjj+vixYt55l+5ckUjRoxQZmamBgwYcMNFAgBwPR7dhzZkyBD985//1JIlS9SwYUN1795d0tV700aNGqUlS5bo6NGj6tq1q/r37+/VggEAyI9HR2iBgYH6/PPP9dvf/lbHjx/XO++8I0nasWOHZs2apaNHj6pv377617/+5dViAQAoiMcjhUREROif//ynJk2apOXLl+vQoUPKyclRbGysevTooebNm3uxTAAACndDYzlKUsOGDdWwYUNv1AIAgMcYbR8AYIQbOkI7e/as3nnnHa1du1bHjh2TZVmKiYnRXXfdpaFDh6pKlSreqhMAgEJ5HGifffaZhgwZIofDkWtg4h9//FH//ve/NXXqVM2fP199+vTxSqEAABTGo0D79ttv1a9fP2VlZem2227TwIEDVbt2bUnS4cOHtWDBAm3dulX9+/fXhg0b1LZtW68WDQDAr3kUaFOmTFF2drb+8pe/6Jlnnskz/3e/+53eeOMNPfPMM3rppZe0dOnSGy4UAIDCeNQpZNOmTWrcuHG+YXbN2LFj1aRJE3399dceFwcAgLs8CrTMzEy3Rttv3LixMjMzPVkFAABF4lGgNWzYUElJSddtd/z4cd18882erAIAgCLxKNCefPJJbdy4UevWrSuwzbp167RhwwY9+eSTHhcHAIC7POoUMmzYMO3bt089e/bUU089lauXY2Jiot5//339/e9/15gxY/TEE094tWAAAPJjs355E1kBAgMDPV+BzaasrCyPl/eE0+mU3W6Xw5GoqKhIn64b/nH/Cy/4uwT40JIp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",
      "text/plain": [
       "<Figure size 480x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "from sklearn.metrics import classification_report\n",
    "from sklearn.metrics import confusion_matrix\n",
    "from sklearn.metrics import roc_curve\n",
    "from sklearn.metrics import auc\n",
    "\n",
    "# 利用模型对测试集进行预测，输出target预测标签值和概率\n",
    "y_test_pred = dtree.predict(X_test)\n",
    "y_test_prob = dtree.predict_proba(X_test)\n",
    "\n",
    "# 分类评估汇总报告classification_report\n",
    "print(classification_report(y_test,y_test_pred))\n",
    "\n",
    "def show_confusion_matrix(cnf_matrix, class_labels):\n",
    "    plt.matshow(cnf_matrix, cmap=plt.cm.YlGn, alpha=0.7)\n",
    "    ax = plt.gca()\n",
    "    ax.set_xlabel('Predicted Label', fontsize=16)\n",
    "    ax.set_xticks(range(0,len(class_labels)))\n",
    "    ax.set_xticklabels(class_labels,rotation=45)\n",
    "    ax.set_ylabel('Actual Label', fontsize=16, rotation=90)\n",
    "    ax.set_yticks(range(0,len(class_labels)))\n",
    "    ax.set_yticklabels(class_labels)\n",
    "    ax.xaxis.set_label_position('top')\n",
    "    ax.xaxis.tick_top()\n",
    "\n",
    "    for row in range(len(cnf_matrix)):\n",
    "        for col in range(len(cnf_matrix[row])):\n",
    "            ax.text(col, row, cnf_matrix[row][col], va='center', ha='center', fontsize=16)\n",
    "\n",
    "class_labels = [0,1]\n",
    "\n",
    "cnf_matrix = confusion_matrix(y_test, y_test_pred) \n",
    "show_confusion_matrix(cnf_matrix, class_labels)\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "55078710-1227-43ed-b8e8-df1c6d9e53c2",
   "metadata": {},
   "source": [
    "### Kmeans"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "82e9232c-66b3-434f-9e1f-5491cf1a9556",
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.cluster import KMeans"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "b8d706cc-2d19-469f-af0a-a037056f4e5c",
   "metadata": {},
   "outputs": [],
   "source": [
    "kmeans_1=KMeans(n_clusters=3)\n",
    "kmeans_1.fit(X)\n",
    "cluster_pred=kmeans_1.predict(X)\n",
    "cluster_pred_2=kmeans_1.labels_\n",
    "cluster_center=kmeans_1.cluster_centers_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "44ea9d96-e5d0-406c-9f53-f5b814811860",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n",
       "       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n",
       "       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 0, 2, 2, 2, 2,\n",
       "       1, 2, 2, 2, 2, 1, 2, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2,\n",
       "       2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n",
       "       2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0,\n",
       "       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
       "       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
       "       0, 0], dtype=int32)"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 聚类结果\n",
    "cluster_pred"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "467d7f20-7a83-4c09-864e-0bf2550f718b",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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BRegsLBQ989KL844ERERGRA5GEHlQ5VojjSjb2R2z5a+kT40R5pR+VAlIgfZs4UoZ/l8QCAAaE0/kyRxXHm5KcO48847cdNNN+Guu+7C+eefj40bN+Ltt9+ed9/y8nI89dRT6OnpwYc+9CH867/+63RJcQBYsmQJhoaG0NjYiFWrVuGqq67CFVdcga9//esAgEsvvRTXX389Nm7ciIqKCjzwwAMAgG3btqGxsRE33XQT3v/+9+PKK6/Eyy+/jPPOO0/z93Pttdfioosuwve//3387ne/w0UXXYSLLroIf/zjH7X/cEwgKVnMI/i///f/4sEHH8S+fftw5MgR/PCHP8SVV1656DG7d+/Gli1b8Nprr2HlypW444478Pd///eqX/P48eMoLS3FsWPHsHz5cmPfABER5bXIwQjqd9RDURQksXD5YRdckCQJ3Zu6EawJZnCERKTH+Pg4+vv7UV1djaKiInUHtbaK5rZaLq0lCWhpMaWqHi1ssd+nltggqzNO7777LlavXo3vfe97qvbv7+9HfX09Lr/8cuzfvx//9E//hGuvvRYRdl4mIqIMk8dlNOxsSBs0AUASSSiKgoadDZDH5cwMkIgyKxQCPB7Rn0kNl0vs39ho7bjINFld43TFFVfgiiuuUL3/Y489hurqanznO98BAJx//vn4xS9+ge9+97sIBnkHj4iIMqdjfwfik3EoUHd3OYkk4pNxbD+wHeE63l0myjleL9DZCdTXi6BosSa4LpeYberqMq35LVnPUWucXnzxRaxbt27WtmAwiBdffDFLIyIionykKAra9+rr2dK2p43V9ohyVTAIdHcDbrcIjOaueUptc7uBnh5g/frsjJN0cVTgdPToUZx11lmztp111lk4fvw4EonEvMecOHECx48fn/VFRERkxFBiCNGRqOrZphQFCqIjUQwnhi0aGRFlXTAIDA6KtUt+/+zn/H6x/fBhBk0O5KjASY/77rsPpaWl018rV67M9pCIiMjhxiaM9WwZnTDes4WIbMzrFQUfenuBWAzo7xePvb1ie2lptkdIOjgqcFqxYgXeeuutWdveeustLF++fMFuybfffjuOHTs2/fWHP/whE0MlIqIcVlxorGdLSaHxni1E5ACSJEqVV1WJR63lyslWHNUA95JLLkFPT8+sbT/72c9wySWXLHjMsmXLsGzZMquHRkREecTn9iFQFkDfSJ+mdD0JEvxlfpS7zenZQkREmZPVGaexsTHs379/ugtwf38/9u/fj0OHDgEQs0WNM0o0Xn/99ejr68NXvvIVvPnmm3jkkUewc+dONDc3Z2P4RESUpyRJQtPaJl3HhuvCkHjXmYjIcbIaOL3yyivTHYABYMuWLbjoootw1113AQCOHDkyHUQBQHV1Nbq7u/Gzn/0Mq1evxne+8x08/vjjLEVOREQZF1oTgqfAA5fK/5W6JBc8BR40rmbPFiIiJ8pqqt5f/MVfLFqS9cknn5z3mP/8z/+0cFRERETpeYu86LyqE/U76uFSXIs2wXXBBQkSujZ2wVvkzdwgiSirFAUYGgLGxoDi4uwucxoYGEB1dTX+8z//E2vWrMnOIBzOUcUhiIiI7CRYE0T3pm64C9yQpv7MlNrmLnCjZ3MP1gdYfpgoH8gy0NoK1NYCFRVAdbV4rK0V22U52yM07sknn4TXwua9Bw4cwN/+7d9i5cqVcLvdOP/889Ha2mrZ66nBwImIiMiAYE0Qg1sG0bKhBf6y2T1b/GV+tGxoweEthxk0EeWJSASorASam4G+vtnP9fWJ7ZWVYj8CTp48iWTy9Bn7ffv24cwzz8RTTz2F1157DV/72tdw++234+GHH87CKAUGTkRERAZ5i7wI14XR29SL2C0x9H+5H7FbYuht6kW4LozSIvZsySmKInryDAyIx0WWHVB+iUSA+nogkRBvi7lvjdS2RELsZ3bwlEwm8cADD6CmpgbLli3Deeedh3vvvXfefeebMfrRj340q3jNgQMHcPnll6OkpATLly/HxRdfjFdeeQW7d+/G1VdfjWPHjkGSJEiShHvuuQcAcOLECdx8880499xzccYZZ6Curg67d+8+7XV/8pOf4IILLsCyZctm1TRI+cIXvoDW1lb8+Z//Ofx+P/7H//gfuPrqq9HV1WX456SXo8qRExER2ZkkSfB5fPB5fNkeCllBloGODqC9HYhGT20PBICmJiAUEo1PKS/JMtDQIAKjeSZQZkkmAZdL7D84aN7b5vbbb8fWrVvx3e9+F5dddhmOHDmCN998U/f5Nm/ejIsuugiPPvoolixZgv3796OgoACXXnopWlpacNddd+G3v/0tAKC4WPS3u/HGG/H666/j6aefxjnnnIMf/vCH2LBhA37961+jtrYWABCPx/Gtb30Ljz/+OHw+H84880xV4zl27BjKy7PXzoGBExEREVE6kYi4yo3HT38ulX/1ta8BnZ0Aq/3mpY4O8fZQOwGZTIr9t28HwmHjrz86OorW1lY8/PDDCIVCAIBAIIDLLrtM9zkPHTqEW265BR/4wAcAYDrwAYDS0lJIkoQVK1bM2n/btm04dOgQzjnnHADAzTffjOeffx7btm3DN7/5TQDA5OQkHnnkEaxevVr1WH71q1/hmWeeQXd3t+7vxyim6hEREREtJtv5V2R7iiImIvVoazMn2/ONN97AiRMn8IlPfML4yaZs2bIF1157LdatW4f7778f0ZkzrfP49a9/jZMnT2LVqlUoLi6e/vr5z38+69jCwkJceOGFqsfxm9/8Bp/5zGdw9913Y/367K0X5YwTERER0ULskH9Ftjc0NDt7Uy1FEccND4tS5Ua43W5N+7tcrtPaAk1OTs76+z333INNmzahu7sbzz33HO6++248/fTT+OxnPzvvOcfGxrBkyRLs27cPS5YsmfVcKpUvNVa1jcBff/11fOITn8A//MM/4I477lB1jFU440RERES0kFT+VbqgKWVm/hXljbExY8ePjhofQ21tLdxuN3bt2qVq/4qKCoyOjuLdd9+d3rZ///7T9lu1ahWam5vxwgsv4HOf+xy2bdsGQMwanTx5cta+F110EU6ePIm3334bNTU1s75mpvSp9dprr+Hyyy9HKBRasMhFJjFwIiIiIpqPHfKvyBFmTKboUlJifAxFRUW49dZb8ZWvfAXbt29HNBrFSy+9hCeeeGLe/evq6uDxePDVr34V0WgUO3bswJNPPjn9fCKRwI033ojdu3fj97//PX75y1/i5Zdfxvnnnw8AqKqqwtjYGHbt2oVYLIZ4PI5Vq1Zh8+bNaGxsRFdXF/r7+7F3717cd999mtcm/eY3v8Hll1+O9evXY8uWLTh69CiOHj2Kd955R/fPyCgGTkRERETzSeVfaQ2AZuZfUV7w+URxRZXZZ9MkSRxnVqG4O++8EzfddBPuuusunH/++di4cSPefvvtefctLy/HU089hZ6eHnzoQx/Cv/7rv06XFAeAJUuWYGhoCI2NjVi1ahWuuuoqXHHFFfj6178OALj00ktx/fXXY+PGjaioqMADDzwAANi2bRsaGxtx00034f3vfz+uvPJKvPzyyzjvvPM0fS/PPvss3nnnHTz11FM4++yzp78++tGP6vvhmEBS5iY35rjjx4+jtLQUx44dw/Lly7M9HCIiIrKrgQGgulr/8f39QFWVWaOhDBofH0d/fz+qq6tRVFSk6pjWVlFcUcuVtSQBLS3mVNWjhS32+9QSG3DGiYiIiGg+dsi/IscIhQCPR9QHUcPlEvs3Nlo7LjIPAyciIiKi+dgl/4ocwesVbbwkKX3w5HKJ/bq6WHzRSRg4EREREc1HkoCmJn3HhsPaAy5yvGAQ6O4G3G7x65/7Fkhtc7uBnh4giy2JSAcGTkREREQLYf4VaRQMijZeLS2A3z/7Ob9fbD98mEGTE7EBLhEREdFCUvlX9fUiKFqsnxPzr2iK1ysmHZuaRHHF0VGx5K28nBORTsYZJyIiIqLFMP+KdJIksVSuqko8MmhyNgZOREREROkw/4oo7zFVj4golyiKaNo5NiZKKfMWJ5F5mH9FlNc440RElAtkWXRfrK0FKipE086KCvH31lbxPBGZg/lXpJKiKIjFYxiQBxCLx6Bo6Y5LtsPAiYjI6SIRoLJStKzv65v9XF+f2F5ZKfYjIiLLyeMyWl9qRW17LSoerEB1azUqHqxAbXstWl9qhTwuZ3xMAwMDkCQJ+/fvz/hr5woGTkREThaJiGpfiYRI05t7NzO1LZEQ+zF4IiKyVORgBJUPVaI50oy+kdk3s/pG+tAcaUblQ5WIHHT25/GTTz4Jr4XVI4eGhrBhwwacc845WLZsGVauXIkbb7wRx48ft+w102HgRETkVLIMNDSIwGixEsmAeF5RxP5M2yMiskTkYAT1O+qRmExAmfozU2pbYjKB+h31jg+ezHDy5Ekk5/l/mMvlwmc+8xn85Cc/we9+9zs8+eST+Pd//3dcf/31WRjl1Jiy9spERGRMRwcQj6cPmlKSSbH/9u3WjouIKA/J4zIadjZAURQksfjnchJJKIqChp0NpqbtJZNJPPDAA6ipqcGyZctw3nnn4d5775133/lmjH70ox9BmrFm78CBA7j88stRUlKC5cuX4+KLL8Yrr7yC3bt34+qrr8axY8cgSRIkScI999wDADhx4gRuvvlmnHvuuTjjjDNQV1eH3bt3n/a6P/nJT3DBBRdg2bJlOHTo0GnjKysrww033ICPfOQj+JM/+RN84hOfwD/+4z/i//2//2f456QXAyciIidSFKC9Xd+xbW2np/QREZEhHfs7EJ+Mpw2aUpJIIj4Zx/YD5t3Muv3223H//ffjzjvvxOuvv44dO3bgrLPO0n2+zZs3o7KyEi+//DL27duH2267DQUFBbj00kvR0tKC5cuX48iRIzhy5AhuvvlmAMCNN96IF198EU8//TT+67/+C3/913+NDRs2oLe3d/q88Xgc3/rWt/D444/jtddew5lnnpl2LH/84x/R1dWFP//zP9f9/RjFcuRERE40NAREo9qPUxRx3PCwqAZGRESGKYqC9r36bma17WlD09qmWTM9eoyOjqK1tRUPP/wwQqEQACAQCOCyyy7Tfc5Dhw7hlltuwQc+8AEAQG1t7fRzpaWlkCQJK1asmLX/tm3bcOjQIZxzzjkAgJtvvhnPP/88tm3bhm9+85sAgMnJSTzyyCNYvXp12jH87d/+LX784x8jkUjg05/+NB5//HHd349RnHEiInKisTFjx4+OmjMOIiLCUGII0ZHoaWua0lGgIDoSxXBi2PAY3njjDZw4cQKf+MQnDJ8rZcuWLbj22muxbt063H///YimuWH361//GidPnsSqVatQXFw8/fXzn/981rGFhYW48MILVY3hu9/9Ll599VX8+Mc/RjQaxZYtWwx9T0ZwxomIyImKi40dX1JizjiIiAhjE8ZuZo1OjMLnMZYF4Ha7Ne3vcrlO6ys1OTk56+/33HMPNm3ahO7ubjz33HO4++678fTTT+Ozn/3svOccGxvDkiVLsG/fPixZsmTWc8Uz/r/ldrtVz7CtWLECK1aswAc+8AGUl5fj4x//OO68806cffbZqo43E2eciIicyOcDAgHtjTclSRxXXm7NuIiI8lBxobGbWSWFxm9m1dbWwu12Y9euXar2r6iowOjoKN59993pbfP1eFq1ahWam5vxwgsv4HOf+xy2bdsGQMwanTx5cta+F110EU6ePIm3334bNTU1s75mpvTplaq+d+LECcPn0oOBExGRE0kS0NSk79hwWHvARUREC/K5fQiUBSBB22erBAmBsgDK3cZvZhUVFeHWW2/FV77yFWzfvh3RaBQvvfQSnnjiiXn3r6urg8fjwVe/+lVEo1Hs2LEDTz755PTziUQCN954I3bv3o3f//73+OUvf4mXX34Z559/PgCgqqoKY2Nj2LVrF2KxGOLxOFatWoXNmzejsbERXV1d6O/vx969e3Hfffehu7tb0/fT09ODbdu24Te/+Q0GBgbQ3d2N66+/Hh/72MdQVVWl98dkCAMnIiKnCoUAjwdwqfwod7nE/o2N1o6LiCjPSJKEprX6bmaF68KGC0Ok3Hnnnbjppptw11134fzzz8fGjRvx9ttvz7tveXk5nnrqKfT09OBDH/oQ/vVf/3W6pDgALFmyBENDQ2hsbMSqVatw1VVX4YorrsDXv/51AMCll16K66+/Hhs3bkRFRQUeeOABAMC2bdvQ2NiIm266Ce9///tx5ZVX4uWXX8Z5552n6Xtxu93YunUrLrvsMpx//vlobm7GX/3VX+GnP/2pvh+OCSRlbnJjjjt+/DhKS0tx7NgxLF++PNvDISIyJhIB6uvTN8F1ucQsU08PsH595sZHRORA4+Pj6O/vR3V1NYqKilQdI4/LqHyoEonJhKqS5C7JBfdSNwa3DMJb5DU4YlrMYr9PLbEBZ5yIiJwsGAS6uwG3WwRGc+9apra53QyaiIgs5C3yovOqTkiSBFeaS2wXXJAgoWtjF4MmB2HgRETkdMEgMDgItLQAfv/s5/x+sf3wYQZNREQWC9YE0b2pG+4CN6SpPzOltrkL3OjZ3IP1AX4uOwnLkRMR5QKvVxR9aGoSzW1HR0XJ8fJyFoIgIsqgYE0Qg1sGsf3AdrTtaUN05FT/In+ZH+G6MEKrQygtKs3iKEkPBk5ERLlEkkSpcp+xfiBERKSft8iLcF0YTWuvxrHxfYi/NwLP0jKUFl0MSWIfPadi4EREREREZJrXATwGoAeS1AevW4F3+jkJgB/ApwBcD+CCbAyQdOIaJyIiIiIiw/oBrAfwQQCPAogCmFu8Wpna/ujUfuunjiMnYOBERERERGTI4xCzR/8x9ff30uyfev4/po573KJxkZkYOBERERER6XYvgOsAjCN9wDTXe1PHXTd1HrIzBk5ERERERLo8DuAOk851B4AnTDoXWYGBExERERGRZv0Amkw+543IxzVPu3fvhiRJkGV5wX2efPJJeL3ejI1pPgyciIiIiIg0+yK0p+al897UeY05evQompqa4Pf7sWzZMqxcuRKf/vSnsWvXLuNDnPIXf/EX+Kd/+idTznXppZfiyJEjKC21d28rliMnIiIiItLkdQA/s+C8702d9w0A5+s6w8DAAD72sY/B6/XiwQcfxIc+9CFMTk4iEongS1/6Et58800zB7woRVFw8uRJLF26eMhRWFiIFStWZGhU+nHGiYiIiIhIk8dg3fzDUohy5fr84z/+IyRJwt69e9HQ0IBVq1bhgx/8ILZs2YKXXnoJACDLMq699lpUVFRg+fLl+Mu//EscOHBg+hz33HMP1qxZg//1v/4XqqqqUFpair/5m7/B6OgoAODv//7v8fOf/xytra2QJAmSJGFgYGA65e65557DxRdfjGXLluEXv/gFTpw4gXA4jDPPPBNFRUW47LLL8PLLL0+/3nypek8++STOO+88eDwefPazn8XQ0NCs7/PAgQO4/PLLUVJSguXLl+Piiy/GK6+8ovvnpgYDJyIiIiIiTXpgfppeynsAntN15PDwMJ5//nl86UtfwhlnnHHa86k1Qn/913+Nt99+G8899xz27duHD3/4w/jEJz6B4eHh6X2j0Sh+9KMf4ac//Sl++tOf4uc//znuv/9+AEBraysuueQSXHfddThy5AiOHDmClStXTh9722234f7778cbb7yBCy+8EF/5ylfQ2dmJjo4OvPrqq6ipqUEwGJz1ejPt2bMH11xzDW688Ubs378fl19+Ob7xjW/M2mfz5s2orKzEyy+/jH379uG2225DQUGBrp+bWkzVIyIiIiJSbRRAn8WvEQUwBqBY01EHDx6Eoij4wAc+sOA+v/jFL7B37168/fbbWLZsGQDg29/+Nn70ox/h2WefxT/8wz8AAJLJJJ588kmUlJQAAP7u7/4Ou3btwr333ovS0lIUFhbC4/HMm2L3z//8z/jkJz8JAHj33Xfx6KOP4sknn8QVV1wBANi6dSt+9rOf4YknnsAtt9xy2vGtra3YsGEDvvKVrwAAVq1ahV/96ld4/vnnp/c5dOgQbrnllunvtba2VtPPSg/OOBERERERqRYFoFj8GgqAg9qPUtKP68CBAxgbG4PP50NxcfH0V39/P6LR6PR+VVVV00ETAJx99tl4++23VY3jIx/5yPR/R6NRTE5O4mMf+9j0toKCAqxduxZvvPHGvMe/8cYbqKurm7XtkksumfX3LVu24Nprr8W6detw//33zxq7VTjjRERERESk2gnbvk5tbS0kSVq0AMTY2BjOPvts7N69+7TnZpb7npv2JkkSksmkqnHMlyZotnvuuQebNm1Cd3c3nnvuOdx99914+umn8dnPftay1+SMExERERGRasts+zrl5eUIBoP43ve+h3ffffe052VZxoc/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yaTYr6HBXml7wSDQ3S1mkiTp9BS81Da3G+jpAdavz844iXIcAyciIiLKXR0dIj1PTZobIPaLx4Ht260dl1bBoEi/a2kB/P7Zz/n9YvvhwwyaiCzENU5ERESUmxRFFH7o69NWOU+SRDDS22vPAguKIprbjo6KkuPl5fYcJ5EDaIkNlmZoTERERESZNTQERKPaj1MUcdzwsCgJbjeSJMZlx7ER5TCm6hEREVFuGhszdvzoqDnjIKKcwMCJiIiIclNxsbHjS0rMGQcR5QQGTkRERJSbfD4gENC+/keSxHHl5daMi4gciYETERER5SZJApqa9B0bDrPgAhHNwsCJiIiIclcoBHg86ZvHprhcYv/GRmvHRUSOw8CJiIiIcpfXC3R2itmjdMGTyyX26+oSxxERzcDAiYiIiHJbMAh0dwNutwiM5qbgpba53UBPD5vIEtG8GDgRERFR7gsGgcFBoKVFNLedye8X2w8fZtBERAuSFEVLK23n09IdmIiIiHKQoojmtqOjouR4eTkLQRDlKS2xwdIMjYmIiIjIHiRJlCr3+bI9EiJyEKbqERERERERpcHAiYiIiIiIKA0GTkRERERERGlkPXD63ve+h6qqKhQVFaGurg579+5ddP+Wlha8//3vh9vtxsqVK9Hc3Izx8fEMjZaIiIiIiPJRVgOnZ555Blu2bMHdd9+NV199FatXr0YwGMTbb7897/47duzAbbfdhrvvvhtvvPEGnnjiCTzzzDP46le/muGRExERERFRPslq4PTQQw/huuuuw9VXX40LLrgAjz32GDweD37wgx/Mu/+vfvUrfOxjH8OmTZtQVVWF9evX42//9m/TzlIREREREREZkbXAaWJiAvv27cO6detODcblwrp16/Diiy/Oe8yll16Kffv2TQdKfX196Onpwac+9amMjJmIiIiIiPJT1vo4xWIxnDx5Emedddas7WeddRbefPPNeY/ZtGkTYrEYLrvsMiiKgvfeew/XX3/9oql6J06cwIkTJ6b/fvz4cXO+ASLKDYoCDA0BY2NAcbHo68JGmERERDRH1otDaLF7925885vfxCOPPIJXX30VXV1d6O7uxr/8y78seMx9992H0tLS6a+VK1dmcMREZFuyDLS2ArW1QEUFUF0tHmtrxXZZzvYIiYiIyEYkRVGUbLzwxMQEPB4Pnn32WVx55ZXT20OhEGRZ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",
      "text/plain": [
       "<Figure size 1000x800 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Visualising the clusters\n",
    "plt.figure(figsize=(10,8))\n",
    "plt.scatter(X[cluster_pred==0,0],X[cluster_pred==0,1], s = 100, c = 'red', label ='cluster 1' )\n",
    "plt.scatter(X[cluster_pred==1,0],X[cluster_pred==1,1], s = 100, c = 'blue', label ='cluster 2' )\n",
    "plt.scatter(X[cluster_pred==2,0],X[cluster_pred==2,1], s = 100, c = 'green', label ='cluster 3' )\n",
    "#plt.scatter(X[cluster_pred==3,0],X[cluster_pred==3,1], s = 100, c = 'cyan', label = 'cluster 4')\n",
    "#plt.scatter(X[cluster_pred==4,0],X[cluster_pred==4,1], s = 100, c = 'magenta', label = 'cluster 5')\n",
    "plt.scatter(cluster_center[:,0],cluster_center[:,1], s = 300, c = 'yellow', label = 'Centroids')\n",
    "plt.xlabel('X')\n",
    "plt.ylabel('Y')\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "ad4c9cf4-0e5a-4ef5-9b50-d23139bfe55e",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "3421baf1-2bea-4c75-9389-164a3a248aaf",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "ab0b8cca-80ed-4464-b870-4c128b95c21e",
   "metadata": {},
   "source": [
    "### 神经网络"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "3d34fd6a-2f52-4ee2-a71a-63f705112470",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 导入数据\n",
    "import pandas as pd\n",
    "wine = pd.read_csv('wine.txt', names = [\"Cultivator\", \"Alchol\", \"Malic_Acid\", \"Ash\", \"Alcalinity_of_Ash\", \"Magnesium\", \"Total_phenols\", \"Falvanoids\", \"Nonflavanoid_phenols\", \"Proanthocyanins\", \"Color_intensity\", \"Hue\", \"OD280\", \"Proline\"])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "14912fcb-82b8-4cd0-9228-efa993b6e4a9",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Cultivator</th>\n",
       "      <th>Alchol</th>\n",
       "      <th>Malic_Acid</th>\n",
       "      <th>Ash</th>\n",
       "      <th>Alcalinity_of_Ash</th>\n",
       "      <th>Magnesium</th>\n",
       "      <th>Total_phenols</th>\n",
       "      <th>Falvanoids</th>\n",
       "      <th>Nonflavanoid_phenols</th>\n",
       "      <th>Proanthocyanins</th>\n",
       "      <th>Color_intensity</th>\n",
       "      <th>Hue</th>\n",
       "      <th>OD280</th>\n",
       "      <th>Proline</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>14.23</td>\n",
       "      <td>1.71</td>\n",
       "      <td>2.43</td>\n",
       "      <td>15.6</td>\n",
       "      <td>127</td>\n",
       "      <td>2.80</td>\n",
       "      <td>3.06</td>\n",
       "      <td>0.28</td>\n",
       "      <td>2.29</td>\n",
       "      <td>5.64</td>\n",
       "      <td>1.04</td>\n",
       "      <td>3.92</td>\n",
       "      <td>1065</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1</td>\n",
       "      <td>13.20</td>\n",
       "      <td>1.78</td>\n",
       "      <td>2.14</td>\n",
       "      <td>11.2</td>\n",
       "      <td>100</td>\n",
       "      <td>2.65</td>\n",
       "      <td>2.76</td>\n",
       "      <td>0.26</td>\n",
       "      <td>1.28</td>\n",
       "      <td>4.38</td>\n",
       "      <td>1.05</td>\n",
       "      <td>3.40</td>\n",
       "      <td>1050</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1</td>\n",
       "      <td>13.16</td>\n",
       "      <td>2.36</td>\n",
       "      <td>2.67</td>\n",
       "      <td>18.6</td>\n",
       "      <td>101</td>\n",
       "      <td>2.80</td>\n",
       "      <td>3.24</td>\n",
       "      <td>0.30</td>\n",
       "      <td>2.81</td>\n",
       "      <td>5.68</td>\n",
       "      <td>1.03</td>\n",
       "      <td>3.17</td>\n",
       "      <td>1185</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1</td>\n",
       "      <td>14.37</td>\n",
       "      <td>1.95</td>\n",
       "      <td>2.50</td>\n",
       "      <td>16.8</td>\n",
       "      <td>113</td>\n",
       "      <td>3.85</td>\n",
       "      <td>3.49</td>\n",
       "      <td>0.24</td>\n",
       "      <td>2.18</td>\n",
       "      <td>7.80</td>\n",
       "      <td>0.86</td>\n",
       "      <td>3.45</td>\n",
       "      <td>1480</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1</td>\n",
       "      <td>13.24</td>\n",
       "      <td>2.59</td>\n",
       "      <td>2.87</td>\n",
       "      <td>21.0</td>\n",
       "      <td>118</td>\n",
       "      <td>2.80</td>\n",
       "      <td>2.69</td>\n",
       "      <td>0.39</td>\n",
       "      <td>1.82</td>\n",
       "      <td>4.32</td>\n",
       "      <td>1.04</td>\n",
       "      <td>2.93</td>\n",
       "      <td>735</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   Cultivator  Alchol  Malic_Acid   Ash  Alcalinity_of_Ash  Magnesium  \\\n",
       "0           1   14.23        1.71  2.43               15.6        127   \n",
       "1           1   13.20        1.78  2.14               11.2        100   \n",
       "2           1   13.16        2.36  2.67               18.6        101   \n",
       "3           1   14.37        1.95  2.50               16.8        113   \n",
       "4           1   13.24        2.59  2.87               21.0        118   \n",
       "\n",
       "   Total_phenols  Falvanoids  Nonflavanoid_phenols  Proanthocyanins  \\\n",
       "0           2.80        3.06                  0.28             2.29   \n",
       "1           2.65        2.76                  0.26             1.28   \n",
       "2           2.80        3.24                  0.30             2.81   \n",
       "3           3.85        3.49                  0.24             2.18   \n",
       "4           2.80        2.69                  0.39             1.82   \n",
       "\n",
       "   Color_intensity   Hue  OD280  Proline  \n",
       "0             5.64  1.04   3.92     1065  \n",
       "1             4.38  1.05   3.40     1050  \n",
       "2             5.68  1.03   3.17     1185  \n",
       "3             7.80  0.86   3.45     1480  \n",
       "4             4.32  1.04   2.93      735  "
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 查看数据\n",
    "wine.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "53a43a65-3c2d-44ae-bbea-5bdc9c05afa5",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(178, 14)"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "wine.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "5c33e571-3138-4210-b72c-53ca5211b560",
   "metadata": {},
   "outputs": [],
   "source": [
    "X = wine.drop('Cultivator',axis=1)\n",
    "y = wine['Cultivator']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "e32547fb-0625-4c60-ada6-f0337f219554",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 下面将数据分成训练集和测试集\n",
    "from sklearn.model_selection import train_test_split"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "8a5d89f4-91cc-46ca-9f62-c2d4d97cd56b",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Alchol</th>\n",
       "      <th>Malic_Acid</th>\n",
       "      <th>Ash</th>\n",
       "      <th>Alcalinity_of_Ash</th>\n",
       "      <th>Magnesium</th>\n",
       "      <th>Total_phenols</th>\n",
       "      <th>Falvanoids</th>\n",
       "      <th>Nonflavanoid_phenols</th>\n",
       "      <th>Proanthocyanins</th>\n",
       "      <th>Color_intensity</th>\n",
       "      <th>Hue</th>\n",
       "      <th>OD280</th>\n",
       "      <th>Proline</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>68</th>\n",
       "      <td>13.34</td>\n",
       "      <td>0.94</td>\n",
       "      <td>2.36</td>\n",
       "      <td>17.0</td>\n",
       "      <td>110</td>\n",
       "      <td>2.53</td>\n",
       "      <td>1.30</td>\n",
       "      <td>0.55</td>\n",
       "      <td>0.42</td>\n",
       "      <td>3.17</td>\n",
       "      <td>1.02</td>\n",
       "      <td>1.93</td>\n",
       "      <td>750</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>14.23</td>\n",
       "      <td>1.71</td>\n",
       "      <td>2.43</td>\n",
       "      <td>15.6</td>\n",
       "      <td>127</td>\n",
       "      <td>2.80</td>\n",
       "      <td>3.06</td>\n",
       "      <td>0.28</td>\n",
       "      <td>2.29</td>\n",
       "      <td>5.64</td>\n",
       "      <td>1.04</td>\n",
       "      <td>3.92</td>\n",
       "      <td>1065</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>23</th>\n",
       "      <td>12.85</td>\n",
       "      <td>1.60</td>\n",
       "      <td>2.52</td>\n",
       "      <td>17.8</td>\n",
       "      <td>95</td>\n",
       "      <td>2.48</td>\n",
       "      <td>2.37</td>\n",
       "      <td>0.26</td>\n",
       "      <td>1.46</td>\n",
       "      <td>3.93</td>\n",
       "      <td>1.09</td>\n",
       "      <td>3.63</td>\n",
       "      <td>1015</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>30</th>\n",
       "      <td>13.73</td>\n",
       "      <td>1.50</td>\n",
       "      <td>2.70</td>\n",
       "      <td>22.5</td>\n",
       "      <td>101</td>\n",
       "      <td>3.00</td>\n",
       "      <td>3.25</td>\n",
       "      <td>0.29</td>\n",
       "      <td>2.38</td>\n",
       "      <td>5.70</td>\n",
       "      <td>1.19</td>\n",
       "      <td>2.71</td>\n",
       "      <td>1285</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>28</th>\n",
       "      <td>13.87</td>\n",
       "      <td>1.90</td>\n",
       "      <td>2.80</td>\n",
       "      <td>19.4</td>\n",
       "      <td>107</td>\n",
       "      <td>2.95</td>\n",
       "      <td>2.97</td>\n",
       "      <td>0.37</td>\n",
       "      <td>1.76</td>\n",
       "      <td>4.50</td>\n",
       "      <td>1.25</td>\n",
       "      <td>3.40</td>\n",
       "      <td>915</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>134</th>\n",
       "      <td>12.51</td>\n",
       "      <td>1.24</td>\n",
       "      <td>2.25</td>\n",
       "      <td>17.5</td>\n",
       "      <td>85</td>\n",
       "      <td>2.00</td>\n",
       "      <td>0.58</td>\n",
       "      <td>0.60</td>\n",
       "      <td>1.25</td>\n",
       "      <td>5.45</td>\n",
       "      <td>0.75</td>\n",
       "      <td>1.51</td>\n",
       "      <td>650</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>107</th>\n",
       "      <td>12.72</td>\n",
       "      <td>1.75</td>\n",
       "      <td>2.28</td>\n",
       "      <td>22.5</td>\n",
       "      <td>84</td>\n",
       "      <td>1.38</td>\n",
       "      <td>1.76</td>\n",
       "      <td>0.48</td>\n",
       "      <td>1.63</td>\n",
       "      <td>3.30</td>\n",
       "      <td>0.88</td>\n",
       "      <td>2.42</td>\n",
       "      <td>488</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>177</th>\n",
       "      <td>14.13</td>\n",
       "      <td>4.10</td>\n",
       "      <td>2.74</td>\n",
       "      <td>24.5</td>\n",
       "      <td>96</td>\n",
       "      <td>2.05</td>\n",
       "      <td>0.76</td>\n",
       "      <td>0.56</td>\n",
       "      <td>1.35</td>\n",
       "      <td>9.20</td>\n",
       "      <td>0.61</td>\n",
       "      <td>1.60</td>\n",
       "      <td>560</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>31</th>\n",
       "      <td>13.58</td>\n",
       "      <td>1.66</td>\n",
       "      <td>2.36</td>\n",
       "      <td>19.1</td>\n",
       "      <td>106</td>\n",
       "      <td>2.86</td>\n",
       "      <td>3.19</td>\n",
       "      <td>0.22</td>\n",
       "      <td>1.95</td>\n",
       "      <td>6.90</td>\n",
       "      <td>1.09</td>\n",
       "      <td>2.88</td>\n",
       "      <td>1515</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>132</th>\n",
       "      <td>12.81</td>\n",
       "      <td>2.31</td>\n",
       "      <td>2.40</td>\n",
       "      <td>24.0</td>\n",
       "      <td>98</td>\n",
       "      <td>1.15</td>\n",
       "      <td>1.09</td>\n",
       "      <td>0.27</td>\n",
       "      <td>0.83</td>\n",
       "      <td>5.70</td>\n",
       "      <td>0.66</td>\n",
       "      <td>1.36</td>\n",
       "      <td>560</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>133 rows × 13 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "     Alchol  Malic_Acid   Ash  Alcalinity_of_Ash  Magnesium  Total_phenols  \\\n",
       "68    13.34        0.94  2.36               17.0        110           2.53   \n",
       "0     14.23        1.71  2.43               15.6        127           2.80   \n",
       "23    12.85        1.60  2.52               17.8         95           2.48   \n",
       "30    13.73        1.50  2.70               22.5        101           3.00   \n",
       "28    13.87        1.90  2.80               19.4        107           2.95   \n",
       "..      ...         ...   ...                ...        ...            ...   \n",
       "134   12.51        1.24  2.25               17.5         85           2.00   \n",
       "107   12.72        1.75  2.28               22.5         84           1.38   \n",
       "177   14.13        4.10  2.74               24.5         96           2.05   \n",
       "31    13.58        1.66  2.36               19.1        106           2.86   \n",
       "132   12.81        2.31  2.40               24.0         98           1.15   \n",
       "\n",
       "     Falvanoids  Nonflavanoid_phenols  Proanthocyanins  Color_intensity   Hue  \\\n",
       "68         1.30                  0.55             0.42             3.17  1.02   \n",
       "0          3.06                  0.28             2.29             5.64  1.04   \n",
       "23         2.37                  0.26             1.46             3.93  1.09   \n",
       "30         3.25                  0.29             2.38             5.70  1.19   \n",
       "28         2.97                  0.37             1.76             4.50  1.25   \n",
       "..          ...                   ...              ...              ...   ...   \n",
       "134        0.58                  0.60             1.25             5.45  0.75   \n",
       "107        1.76                  0.48             1.63             3.30  0.88   \n",
       "177        0.76                  0.56             1.35             9.20  0.61   \n",
       "31         3.19                  0.22             1.95             6.90  1.09   \n",
       "132        1.09                  0.27             0.83             5.70  0.66   \n",
       "\n",
       "     OD280  Proline  \n",
       "68    1.93      750  \n",
       "0     3.92     1065  \n",
       "23    3.63     1015  \n",
       "30    2.71     1285  \n",
       "28    3.40      915  \n",
       "..     ...      ...  \n",
       "134   1.51      650  \n",
       "107   2.42      488  \n",
       "177   1.60      560  \n",
       "31    2.88     1515  \n",
       "132   1.36      560  \n",
       "\n",
       "[133 rows x 13 columns]"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_train, X_test, y_train, y_test = train_test_split(X, y)\n",
    "X_train"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "6d83ea68-a1a1-427e-abd0-5038c840a839",
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.preprocessing import StandardScaler"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "7c14848c-7620-484e-a3d0-40fa89055210",
   "metadata": {},
   "outputs": [],
   "source": [
    "scaler = StandardScaler()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "639c004c-3f2b-4dae-913b-af886a766f26",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "原始数据：\n",
      "      Alchol  Malic_Acid   Ash  Alcalinity_of_Ash  Magnesium  Total_phenols  \\\n",
      "68    13.34        0.94  2.36               17.0        110           2.53   \n",
      "0     14.23        1.71  2.43               15.6        127           2.80   \n",
      "23    12.85        1.60  2.52               17.8         95           2.48   \n",
      "30    13.73        1.50  2.70               22.5        101           3.00   \n",
      "28    13.87        1.90  2.80               19.4        107           2.95   \n",
      "..      ...         ...   ...                ...        ...            ...   \n",
      "134   12.51        1.24  2.25               17.5         85           2.00   \n",
      "107   12.72        1.75  2.28               22.5         84           1.38   \n",
      "177   14.13        4.10  2.74               24.5         96           2.05   \n",
      "31    13.58        1.66  2.36               19.1        106           2.86   \n",
      "132   12.81        2.31  2.40               24.0         98           1.15   \n",
      "\n",
      "     Falvanoids  Nonflavanoid_phenols  Proanthocyanins  Color_intensity   Hue  \\\n",
      "68         1.30                  0.55             0.42             3.17  1.02   \n",
      "0          3.06                  0.28             2.29             5.64  1.04   \n",
      "23         2.37                  0.26             1.46             3.93  1.09   \n",
      "30         3.25                  0.29             2.38             5.70  1.19   \n",
      "28         2.97                  0.37             1.76             4.50  1.25   \n",
      "..          ...                   ...              ...              ...   ...   \n",
      "134        0.58                  0.60             1.25             5.45  0.75   \n",
      "107        1.76                  0.48             1.63             3.30  0.88   \n",
      "177        0.76                  0.56             1.35             9.20  0.61   \n",
      "31         3.19                  0.22             1.95             6.90  1.09   \n",
      "132        1.09                  0.27             0.83             5.70  0.66   \n",
      "\n",
      "     OD280  Proline  \n",
      "68    1.93      750  \n",
      "0     3.92     1065  \n",
      "23    3.63     1015  \n",
      "30    2.71     1285  \n",
      "28    3.40      915  \n",
      "..     ...      ...  \n",
      "134   1.51      650  \n",
      "107   2.42      488  \n",
      "177   1.60      560  \n",
      "31    2.88     1515  \n",
      "132   1.36      560  \n",
      "\n",
      "[133 rows x 13 columns]\n",
      "均值： [1.29963910e+01 2.32060150e+00 2.36406015e+00 1.93849624e+01\n",
      " 9.97819549e+01 2.28323308e+00 2.00827068e+00 3.68496241e-01\n",
      " 1.59436090e+00 4.99774436e+00 9.60721805e-01 2.61669173e+00\n",
      " 7.65616541e+02]\n",
      "标准差： [8.23137532e-01 1.08590336e+00 2.68902077e-01 3.37724576e+00\n",
      " 1.45892835e+01 6.21353784e-01 1.00747023e+00 1.31140149e-01\n",
      " 5.88344630e-01 2.29539703e+00 2.21752194e-01 7.09782050e-01\n",
      " 3.16444361e+02]\n",
      "标准化后的数据：\n",
      " StandardScaler()\n"
     ]
    }
   ],
   "source": [
    "# Fit only to the training data\n",
    "X_scaled = scaler.fit(X_train)\n",
    "print(\"原始数据：\\n\", X_train)\n",
    "print(\"均值：\", scaler.mean_)\n",
    "print(\"标准差：\", scaler.scale_)\n",
    "print(\"标准化后的数据：\\n\", X_scaled)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "c230377d-4076-4f43-afd8-5907ba92c690",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 0.41743817, -1.27138524, -0.01509899, ...,  0.26731729,\n",
       "        -0.96746843, -0.04935004],\n",
       "       [ 1.49866696, -0.5622982 ,  0.24521882, ...,  0.35750806,\n",
       "         1.83620912,  0.94608562],\n",
       "       [-0.1778451 , -0.66359635,  0.57991315, ...,  0.58298497,\n",
       "         1.42763299,  0.78807996],\n",
       "       ...,\n",
       "       [ 1.37718058,  1.63863431,  1.39805484, ..., -1.58159339,\n",
       "        -1.43239989, -0.64977155],\n",
       "       [ 0.70900548, -0.60834281, -0.01509899, ...,  0.58298497,\n",
       "         0.3709706 ,  2.36813656],\n",
       "       [-0.22643965, -0.00976284,  0.13365404, ..., -1.35611648,\n",
       "        -1.77053185, -0.64977155]])"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Now apply the transformations to the data:\n",
    "X_train = scaler.transform(X_train)\n",
    "X_test = scaler.transform(X_test)\n",
    "X_train"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "130681c4-369e-4ac2-bba3-5533ead5e47d",
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.neural_network import MLPClassifier"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "fc24279b-61b4-4efc-b523-8863733453d5",
   "metadata": {},
   "outputs": [],
   "source": [
    "mlp = MLPClassifier(hidden_layer_sizes=(13,13,13),max_iter=500)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "229e7e7f-c72c-4e12-9a1b-0b0712410d72",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<style>#sk-container-id-1 {\n",
       "  /* Definition of color scheme common for light and dark mode */\n",
       "  --sklearn-color-text: black;\n",
       "  --sklearn-color-line: gray;\n",
       "  /* Definition of color scheme for unfitted estimators */\n",
       "  --sklearn-color-unfitted-level-0: #fff5e6;\n",
       "  --sklearn-color-unfitted-level-1: #f6e4d2;\n",
       "  --sklearn-color-unfitted-level-2: #ffe0b3;\n",
       "  --sklearn-color-unfitted-level-3: chocolate;\n",
       "  /* Definition of color scheme for fitted estimators */\n",
       "  --sklearn-color-fitted-level-0: #f0f8ff;\n",
       "  --sklearn-color-fitted-level-1: #d4ebff;\n",
       "  --sklearn-color-fitted-level-2: #b3dbfd;\n",
       "  --sklearn-color-fitted-level-3: cornflowerblue;\n",
       "\n",
       "  /* Specific color for light theme */\n",
       "  --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, white)));\n",
       "  --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-icon: #696969;\n",
       "\n",
       "  @media (prefers-color-scheme: dark) {\n",
       "    /* Redefinition of color scheme for dark theme */\n",
       "    --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, #111)));\n",
       "    --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-icon: #878787;\n",
       "  }\n",
       "}\n",
       "\n",
       "#sk-container-id-1 {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 pre {\n",
       "  padding: 0;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 input.sk-hidden--visually {\n",
       "  border: 0;\n",
       "  clip: rect(1px 1px 1px 1px);\n",
       "  clip: rect(1px, 1px, 1px, 1px);\n",
       "  height: 1px;\n",
       "  margin: -1px;\n",
       "  overflow: hidden;\n",
       "  padding: 0;\n",
       "  position: absolute;\n",
       "  width: 1px;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-dashed-wrapped {\n",
       "  border: 1px dashed var(--sklearn-color-line);\n",
       "  margin: 0 0.4em 0.5em 0.4em;\n",
       "  box-sizing: border-box;\n",
       "  padding-bottom: 0.4em;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-container {\n",
       "  /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n",
       "     but bootstrap.min.css set `[hidden] { display: none !important; }`\n",
       "     so we also need the `!important` here to be able to override the\n",
       "     default hidden behavior on the sphinx rendered scikit-learn.org.\n",
       "     See: https://github.com/scikit-learn/scikit-learn/issues/21755 */\n",
       "  display: inline-block !important;\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-text-repr-fallback {\n",
       "  display: none;\n",
       "}\n",
       "\n",
       "div.sk-parallel-item,\n",
       "div.sk-serial,\n",
       "div.sk-item {\n",
       "  /* draw centered vertical line to link estimators */\n",
       "  background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));\n",
       "  background-size: 2px 100%;\n",
       "  background-repeat: no-repeat;\n",
       "  background-position: center center;\n",
       "}\n",
       "\n",
       "/* Parallel-specific style estimator block */\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel-item::after {\n",
       "  content: \"\";\n",
       "  width: 100%;\n",
       "  border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n",
       "  flex-grow: 1;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel {\n",
       "  display: flex;\n",
       "  align-items: stretch;\n",
       "  justify-content: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel-item {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel-item:first-child::after {\n",
       "  align-self: flex-end;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel-item:last-child::after {\n",
       "  align-self: flex-start;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel-item:only-child::after {\n",
       "  width: 0;\n",
       "}\n",
       "\n",
       "/* Serial-specific style estimator block */\n",
       "\n",
       "#sk-container-id-1 div.sk-serial {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "  align-items: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  padding-right: 1em;\n",
       "  padding-left: 1em;\n",
       "}\n",
       "\n",
       "\n",
       "/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is\n",
       "clickable and can be expanded/collapsed.\n",
       "- Pipeline and ColumnTransformer use this feature and define the default style\n",
       "- Estimators will overwrite some part of the style using the `sk-estimator` class\n",
       "*/\n",
       "\n",
       "/* Pipeline and ColumnTransformer style (default) */\n",
       "\n",
       "#sk-container-id-1 div.sk-toggleable {\n",
       "  /* Default theme specific background. It is overwritten whether we have a\n",
       "  specific estimator or a Pipeline/ColumnTransformer */\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "/* Toggleable label */\n",
       "#sk-container-id-1 label.sk-toggleable__label {\n",
       "  cursor: pointer;\n",
       "  display: block;\n",
       "  width: 100%;\n",
       "  margin-bottom: 0;\n",
       "  padding: 0.5em;\n",
       "  box-sizing: border-box;\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 label.sk-toggleable__label-arrow:before {\n",
       "  /* Arrow on the left of the label */\n",
       "  content: \"▸\";\n",
       "  float: left;\n",
       "  margin-right: 0.25em;\n",
       "  color: var(--sklearn-color-icon);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 label.sk-toggleable__label-arrow:hover:before {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "/* Toggleable content - dropdown */\n",
       "\n",
       "#sk-container-id-1 div.sk-toggleable__content {\n",
       "  max-height: 0;\n",
       "  max-width: 0;\n",
       "  overflow: hidden;\n",
       "  text-align: left;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-toggleable__content.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-toggleable__content pre {\n",
       "  margin: 0.2em;\n",
       "  border-radius: 0.25em;\n",
       "  color: var(--sklearn-color-text);\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-toggleable__content.fitted pre {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 input.sk-toggleable__control:checked~div.sk-toggleable__content {\n",
       "  /* Expand drop-down */\n",
       "  max-height: 200px;\n",
       "  max-width: 100%;\n",
       "  overflow: auto;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n",
       "  content: \"▾\";\n",
       "}\n",
       "\n",
       "/* Pipeline/ColumnTransformer-specific style */\n",
       "\n",
       "#sk-container-id-1 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator-specific style */\n",
       "\n",
       "/* Colorize estimator box */\n",
       "#sk-container-id-1 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-label label.sk-toggleable__label,\n",
       "#sk-container-id-1 div.sk-label label {\n",
       "  /* The background is the default theme color */\n",
       "  color: var(--sklearn-color-text-on-default-background);\n",
       "}\n",
       "\n",
       "/* On hover, darken the color of the background */\n",
       "#sk-container-id-1 div.sk-label:hover label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "/* Label box, darken color on hover, fitted */\n",
       "#sk-container-id-1 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator label */\n",
       "\n",
       "#sk-container-id-1 div.sk-label label {\n",
       "  font-family: monospace;\n",
       "  font-weight: bold;\n",
       "  display: inline-block;\n",
       "  line-height: 1.2em;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-label-container {\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "/* Estimator-specific */\n",
       "#sk-container-id-1 div.sk-estimator {\n",
       "  font-family: monospace;\n",
       "  border: 1px dotted var(--sklearn-color-border-box);\n",
       "  border-radius: 0.25em;\n",
       "  box-sizing: border-box;\n",
       "  margin-bottom: 0.5em;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-estimator.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "/* on hover */\n",
       "#sk-container-id-1 div.sk-estimator:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-estimator.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Specification for estimator info (e.g. \"i\" and \"?\") */\n",
       "\n",
       "/* Common style for \"i\" and \"?\" */\n",
       "\n",
       ".sk-estimator-doc-link,\n",
       "a:link.sk-estimator-doc-link,\n",
       "a:visited.sk-estimator-doc-link {\n",
       "  float: right;\n",
       "  font-size: smaller;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1em;\n",
       "  height: 1em;\n",
       "  width: 1em;\n",
       "  text-decoration: none !important;\n",
       "  margin-left: 1ex;\n",
       "  /* unfitted */\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted,\n",
       "a:link.sk-estimator-doc-link.fitted,\n",
       "a:visited.sk-estimator-doc-link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "div.sk-estimator:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "div.sk-estimator.fitted:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "/* Span, style for the box shown on hovering the info icon */\n",
       ".sk-estimator-doc-link span {\n",
       "  display: none;\n",
       "  z-index: 9999;\n",
       "  position: relative;\n",
       "  font-weight: normal;\n",
       "  right: .2ex;\n",
       "  padding: .5ex;\n",
       "  margin: .5ex;\n",
       "  width: min-content;\n",
       "  min-width: 20ex;\n",
       "  max-width: 50ex;\n",
       "  color: var(--sklearn-color-text);\n",
       "  box-shadow: 2pt 2pt 4pt #999;\n",
       "  /* unfitted */\n",
       "  background: var(--sklearn-color-unfitted-level-0);\n",
       "  border: .5pt solid var(--sklearn-color-unfitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted span {\n",
       "  /* fitted */\n",
       "  background: var(--sklearn-color-fitted-level-0);\n",
       "  border: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link:hover span {\n",
       "  display: block;\n",
       "}\n",
       "\n",
       "/* \"?\"-specific style due to the `<a>` HTML tag */\n",
       "\n",
       "#sk-container-id-1 a.estimator_doc_link {\n",
       "  float: right;\n",
       "  font-size: 1rem;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1rem;\n",
       "  height: 1rem;\n",
       "  width: 1rem;\n",
       "  text-decoration: none;\n",
       "  /* unfitted */\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 a.estimator_doc_link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "#sk-container-id-1 a.estimator_doc_link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 a.estimator_doc_link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "</style><div id=\"sk-container-id-1\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>MLPClassifier(hidden_layer_sizes=(13, 13, 13), max_iter=500)</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-1\" type=\"checkbox\" checked><label for=\"sk-estimator-id-1\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\">&nbsp;&nbsp;MLPClassifier<a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.5/modules/generated/sklearn.neural_network.MLPClassifier.html\">?<span>Documentation for MLPClassifier</span></a><span class=\"sk-estimator-doc-link fitted\">i<span>Fitted</span></span></label><div class=\"sk-toggleable__content fitted\"><pre>MLPClassifier(hidden_layer_sizes=(13, 13, 13), max_iter=500)</pre></div> </div></div></div></div>"
      ],
      "text/plain": [
       "MLPClassifier(hidden_layer_sizes=(13, 13, 13), max_iter=500)"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "mlp.fit(X_train,y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "4d82aea8-7ff0-4f23-9f96-099f6d007658",
   "metadata": {},
   "outputs": [],
   "source": [
    "predictions = mlp.predict(X_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "4e7d9664-4270-4ae0-88f5-f9909d85412f",
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.metrics import classification_report,confusion_matrix, ConfusionMatrixDisplay\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "4941509b-ac56-467b-8865-ff98bd8634c2",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[14  0  0]\n",
      " [ 0 18  0]\n",
      " [ 0  0 13]]\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAfIAAAG2CAYAAACEWASqAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAA03klEQVR4nO3de3RU9bn/8c9OQiYBMpGAAUYCRqlABIMi8kOUyykFo+Uiy6P1oEaseKxBLikI1MNNxHhpEVEOWK1EeqDoqoKILcpBIVDElktsrRiuSgS5HSQhAXKZ2b8/MGPHgGay577fr7X2svOd2Xs/00l48jzf7+xtmKZpCgAARKW4cAcAAAAaj0QOAEAUI5EDABDFSOQAAEQxEjkAAFGMRA4AQBQjkQMAEMVI5AAARDESOQAAUYxEDgBAFCORAwAQBEVFRRoyZIhcLpcMw9DKlSt9nq+oqNCYMWPUrl07JScnKysrS4sWLfL7PCRyAACCoLKyUtnZ2VqwYMF5n8/Pz9eaNWv0P//zP9q5c6fGjx+vMWPGaNWqVX6dx+CmKQAABJdhGFqxYoWGDx/uHevatavuuOMOTZs2zTvWo0cP5eTk6PHHH2/wsRMCGWioeTweHTp0SCkpKTIMI9zhAAD8ZJqmTp06JZfLpbi44DWJz549q+rqasvHMU2zXr5xOBxyOBx+H+v666/XqlWrdN9998nlcmn9+vXatWuXnn32Wb+DilqlpaWmJDY2Nja2KN9KS0uDlivOnDljtkmPD0iczZs3rzc2Y8aMH4xBkrlixQqfsbNnz5r33HOPKclMSEgwExMTzVdffdXv9xfVFXlKSookadSfhyqxWZMwR4NgK+lbG+4QAARYrWq0SX/y/nseDNXV1Tp81K0vtl0qZ0rjq/7yUx516PG5SktL5XQ6veONqcYl6fnnn9eWLVu0atUqdejQQUVFRcrLy5PL5dLAgQMbfJyoTuR17Y3EZk2U2JxEHusSmD4BYo957j+hmB5tnmKoeUrjz+PRuX2dTqdPIm+MM2fO6Fe/+pVWrFihW265RZJ01VVXqbi4WL/+9a/tk8gBAGgot+mR27S2f6DU1NSopqam3rqA+Ph4eTz+nYdEDgCwBY9MedT4TO7vvhUVFdqzZ4/38f79+1VcXKy0tDS1b99e/fr106RJk5ScnKwOHTpow4YNWrJkiebOnevXeUjkAAAEwdatWzVgwADv4/z8fElSbm6uCgsLtXz5ck2dOlUjR47UiRMn1KFDB82ZM0cPPvigX+chkQMAbMEjj6w0x/3du3///jK/51Itbdq00eLFiy1EdA6JHABgC27TlNvCNdCs7BtMXKIVAIAoRkUOALCFUC92CxUSOQDAFjwy5Y7BRE5rHQCAKEZFDgCwBVrrAABEMVatAwCAiENFDgCwBc83m5X9IxGJHABgC26Lq9at7BtMJHIAgC24TVm8+1ngYgkk5sgBAIhiVOQAAFtgjhwAgCjmkSG3DEv7RyJa6wAARDEqcgCALXjMc5uV/SMRiRwAYAtui611K/sGE611AACiGBU5AMAWYrUiJ5EDAGzBYxrymBZWrVvYN5horQMAEMWoyAEAtkBrHQCAKOZWnNwWGtHuAMYSSCRyAIAtmBbnyE3myAEAQKBRkQMAbIE5cgAAopjbjJPbtDBHHqGXaKW1DgBAFKMiBwDYgkeGPBbqV48isyQnkQMAbCFW58hprQMAEARFRUUaMmSIXC6XDMPQypUr671m586dGjp0qFJTU9WsWTP17NlTBw4c8Os8JHIAgC3ULXazsvmjsrJS2dnZWrBgwXmf37t3r2644QZ17txZ69ev19///ndNmzZNSUlJfp2H1joAwBbOzZFbuGmKn/vm5OQoJyfngs8/+uijuvnmm/X00097xy6//HK/46IiBwDAD+Xl5T5bVVWV38fweDx65513dMUVV2jw4MFKT09Xr169ztt+/yEkcgCALXi+udZ6Y7e6Fe8ZGRlKTU31bgUFBX7HcvToUVVUVOjJJ5/UTTfdpPfee0+33nqrRowYoQ0bNvh1LFrrAABbsH5BmHNfPystLZXT6fSOOxwOv4/l8XgkScOGDdOECRMkSd27d9fmzZu1aNEi9evXr8HHIpEDAGzB8y9VdeP2P5fInU6nTyJvjFatWikhIUFZWVk+4126dNGmTZv8OhatdQAAQiwxMVE9e/ZUSUmJz/iuXbvUoUMHv45FRQ4AsAW3acht4Vak/u5bUVGhPXv2eB/v379fxcXFSktLU/v27TVp0iTdcccd6tu3rwYMGKA1a9bo7bff1vr16/06D4kcAGALdYvWGr+/f5do3bp1qwYMGOB9nJ+fL0nKzc1VYWGhbr31Vi1atEgFBQUaO3asOnXqpDfeeEM33HCDX+chkQMAEAT9+/eXaX5/8r/vvvt03333WToPiRwAYAseM04eC6vWPT+QlMOFRA4AsIVQt9ZDhVXrAABEMSpyAIAteOT/yvPv7h+JSOQAAFuwfkGYyGxiR2ZUAACgQajIAQC2YP1a65FZ+5LIAQC2EOr7kYdKZP55AUnS6e2mSse7tXtwrXb2qNWpDy681OKrJ9za2aNWJ5ZF6nIM+GvIvcf16kef6u19f9dzq3erU/fT4Q4JQcTnHXx1FbmVLRJFZlSQJHnOmHJcIbWe/P0fU/n7Hp35h6mEi0MUGIKu39Cv9cCMQ1o6t43yBl+hfZ8mac6yfUptWRPu0BAEfN6wIiIS+YIFC3TppZcqKSlJvXr10l//+tdwhxQRmveJU/pD8XL+24U/ppqjpo4849Elj8fLYKIkZox44LjWLEvTe6+l6cDuJM2f3E5VZwwNvvNEuENDEPB5h0bdBWGsbJEo7FG99tprys/P14wZM7R9+3ZlZ2dr8ODBOnr0aLhDi3imx9ShaR61vDtOjssjc+4G/kto4tGPrjqt7RtTvGOmaWjHxhRl9aDdGmv4vEPHYxqWt0gU9kQ+d+5cjR49WqNGjVJWVpYWLVqkpk2b6pVXXgl3aBHv/wpNGfFSizsj84cLjeNMcys+QTp5zLfF8vXxBLW4uDZMUSFY+LxhVVibsdXV1dq2bZumTp3qHYuLi9PAgQP14Ycf1nt9VVWVqqqqvI/Ly8tDEmckOrPT1InlHmUujZdhkMgB4Id4LLbHuSDMeRw/flxut1utW7f2GW/durUOHz5c7/UFBQVKTU31bhkZGaEKNeKc2WHKfULac4tbO6+r1c7ralXzlXTkWY/2/JS/4qNZ+Yl4uWuli75TjbVoVauvj7EQItbweYdO3d3PrGyRKDKjuoCpU6eqrKzMu5WWloY7pLBx3mwoc3m8Mpd9uyVcLLW821DGC/HhDg8W1NbEafffm+rqG055xwzDVPcbKvTptqZhjAzBwOcNq8L6516rVq0UHx+vI0eO+IwfOXJEbdq0qfd6h8Mhh8MRqvDCznPaVPW//K1SfUg6W2Iq3ik1aWso4SLf1xsJUkIrQ45LabVHuzd/20oT55Vq18dNVbKjqW4dfUxJTT16b3lauENDEPB5h4ZbhtwWLupiZd9gCmsiT0xMVI8ePbRu3ToNHz5ckuTxeLRu3TqNGTMmnKFFhDOfmjrwn99e4OXo3HP/O/WnhlyzqLpj2YZVLZTa0q17Jh1Wi4trte+fyXp0ZKZOHm8S7tAQBHzeoWG1PR6prfWwT8Dk5+crNzdX1157ra677jrNmzdPlZWVGjVqVLhDC7tm18apy7aG/+B0XB32jxMBtGpxK61a3CrcYSBE+LzRWGH/l/+OO+7QsWPHNH36dB0+fFjdu3fXmjVr6i2AAwDACrestcfdgQsloMKeyCVpzJgxtNIBAEFFax0AgCgWq7cxjcyoAABAg1CRAwBswbR4P3KTr58BABA+tNYBAEDEoSIHANiC1VuRRuptTEnkAABbcFu8+5mVfYMpMqMCAAANQkUOALCFWG2tU5EDAGzBozjLmz+Kioo0ZMgQuVwuGYahlStXXvC1Dz74oAzD0Lx58/x+XyRyAACCoLKyUtnZ2VqwYMH3vm7FihXasmWLXC5Xo85Dax0AYAtu05DbQnvc331zcnKUk5Pzva85ePCgHn74Yb377ru65ZZbGhUXiRwAYAuBmiMvLy/3GXc4HHI4HP4fz+PR3XffrUmTJunKK69sdFy01gEAtmB+c/ezxm7mN1d2y8jIUGpqqncrKChoVDxPPfWUEhISNHbsWEvvi4ocAAA/lJaWyul0eh83phrftm2bnnvuOW3fvl2GYW01PBU5AMAW3DIsb5LkdDp9tsYk8o0bN+ro0aNq3769EhISlJCQoC+++EK//OUvdemll/p1LCpyAIAteExr3wX3mIGL5e6779bAgQN9xgYPHqy7775bo0aN8utYJHIAAIKgoqJCe/bs8T7ev3+/iouLlZaWpvbt26tly5Y+r2/SpInatGmjTp06+XUeEjkAwBbqFq1Z2d8fW7du1YABA7yP8/PzJUm5ubkqLCxsdBzfRSIHANiCR4Y8stBa93Pf/v37yzQb3o///PPP/YzoHBa7AQAQxajIAQC2EOoru4UKiRwAYAuhniMPlciMCgAANAgVOQDAFjyyeK11CwvlgolEDgCwBdPiqnWTRA4AQPgE6u5nkYY5cgAAohgVOQDAFmJ11TqJHABgC7TWAQBAxKEiBwDYQqivtR4qJHIAgC3QWgcAABGHihwAYAuxWpGTyAEAthCriZzWOgAAUYyKHABgC7FakZPIAQC2YMraV8jMwIUSUCRyAIAtxGpFzhw5AABRjIocAGALsVqRk8gBALYQq4mc1joAAFGMihwAYAuxWpGTyAEAtmCahkwLydjKvsFEax0AgChGRQ4AsAXuRw4AQBSL1TlyWusAAEQxEjkAwBbqFrtZ2fxRVFSkIUOGyOVyyTAMrVy50vtcTU2NJk+erG7duqlZs2ZyuVy65557dOjQIb/fF4kcAGALda11K5s/KisrlZ2drQULFtR77vTp09q+fbumTZum7du3680331RJSYmGDh3q9/tijhwAYAuh/vpZTk6OcnJyzvtcamqq1q5d6zP2wgsv6LrrrtOBAwfUvn37Bp+HRA4AgB/Ky8t9HjscDjkcDsvHLSsrk2EYuuiii/zaLyYSeUnfWiUYkbmaEIHz7qHicIeAEBrs6h7uEBBjTIur1usq8oyMDJ/xGTNmaObMmVZC09mzZzV58mTdeeedcjqdfu0bE4kcAIAfYkoyTWv7S1JpaalPsrVajdfU1Oj222+XaZpauHCh3/uTyAEA8IPT6fS7ar6QuiT+xRdf6P3332/UcUnkAABb8MiQEUFXdqtL4rt379YHH3ygli1bNuo4JHIAgC2EetV6RUWF9uzZ4328f/9+FRcXKy0tTW3bttVtt92m7du3a/Xq1XK73Tp8+LAkKS0tTYmJiQ0+D4kcAIAg2Lp1qwYMGOB9nJ+fL0nKzc3VzJkztWrVKklS9+7dffb74IMP1L9//wafh0QOALAFj2nICOG11vv37y/ze1bXfd9z/iCRAwBswTQtrloPTN4NOC7RCgBAFKMiBwDYQqgXu4UKiRwAYAskcgAAolioF7uFCnPkAABEMSpyAIAtxOqqdRI5AMAWziVyK3PkAQwmgGitAwAQxajIAQC2wKp1AACimKlv7yne2P0jEa11AACiGBU5AMAWaK0DABDNYrS3TiIHANiDxYpcEVqRM0cOAEAUoyIHANgCV3YDACCKxepiN1rrAABEMSpyAIA9mIa1BWsRWpGTyAEAthCrc+S01gEAiGJU5AAAe7DzBWFWrVrV4AMOHTq00cEAABAssbpqvUGJfPjw4Q06mGEYcrvdVuIBAAB+aFAi93g8wY4DAIDgi9D2uBWW5sjPnj2rpKSkQMUCAEDQxGpr3e9V6263W7Nnz9Yll1yi5s2ba9++fZKkadOm6Xe/+13AAwQAICDMAGwRyO9EPmfOHBUWFurpp59WYmKid7xr1656+eWXAxocAAD4fn4n8iVLlui3v/2tRo4cqfj4eO94dna2Pvvss4AGBwBA4BgB2CKP34n84MGD6tixY71xj8ejmpqagAQFAEDAhbi1XlRUpCFDhsjlcskwDK1cudI3HNPU9OnT1bZtWyUnJ2vgwIHavXu332/L70SelZWljRs31hv/4x//qKuvvtrvAAAAiEWVlZXKzs7WggULzvv8008/rfnz52vRokX66KOP1KxZMw0ePFhnz5716zx+r1qfPn26cnNzdfDgQXk8Hr355psqKSnRkiVLtHr1an8PBwBAaIT4ym45OTnKyck5/6FMU/PmzdN//dd/adiwYZLOTV23bt1aK1eu1M9+9rMGn8fvinzYsGF6++239b//+79q1qyZpk+frp07d+rtt9/WT37yE38PBwBAaNTd/czKJqm8vNxnq6qq8juU/fv36/Dhwxo4cKB3LDU1Vb169dKHH37o17Ea9T3yG2+8UWvXrm3MrgAARLWMjAyfxzNmzNDMmTP9Osbhw4clSa1bt/YZb926tfe5hmr0BWG2bt2qnTt3Sjo3b96jR4/GHgoAgKAL1G1MS0tL5XQ6veMOh8NiZNb4nci//PJL3XnnnfrLX/6iiy66SJJ08uRJXX/99Vq+fLnatWsX6BgBALAuQHPkTqfTJ5E3Rps2bSRJR44cUdu2bb3jR44cUffu3f06lt9z5Pfff79qamq0c+dOnThxQidOnNDOnTvl8Xh0//33+3s4AABsJzMzU23atNG6deu8Y+Xl5froo4/Uu3dvv47ld0W+YcMGbd68WZ06dfKOderUSc8//7xuvPFGfw8HAEBo/MuCtUbv74eKigrt2bPH+3j//v0qLi5WWlqa2rdvr/Hjx+vxxx/Xj370I2VmZmratGlyuVwNvuNoHb8TeUZGxnkv/OJ2u+Vyufw9HAAAIWGY5zYr+/tj69atGjBggPdxfn6+JCk3N1eFhYV65JFHVFlZqQceeEAnT57UDTfcoDVr1vh9MzK/E/kzzzyjhx9+WAsWLNC1117rDXbcuHH69a9/7e/hAAAIjRB/j7x///4yv2d1nWEYeuyxx/TYY49ZCKqBibxFixYyjG9bCpWVlerVq5cSEs7tXltbq4SEBN13331+twQAAEDjNSiRz5s3L8hhAAAQZCGeIw+VBiXy3NzcYMcBAEBwhbi1HiqNviCMJJ09e1bV1dU+Y1a/WwcAABrO7++RV1ZWasyYMUpPT1ezZs3UokULnw0AgIgU4tuYhorfifyRRx7R+++/r4ULF8rhcOjll1/WrFmz5HK5tGTJkmDECACAdTGayP1urb/99ttasmSJ+vfvr1GjRunGG29Ux44d1aFDBy1dulQjR44MRpwAAOA8/K7IT5w4ocsuu0zSufnwEydOSJJuuOEGFRUVBTY6AAACJUC3MY00fifyyy67TPv375ckde7cWa+//rqkc5V63U1UEDxD7j2uVz/6VG/v+7ueW71bnbqfDndICIB/bGmm6fdk6s6rr9RgV3dt/nOqz/NnKuP0wq8u0cgeWRpy2VUa3a+zVi9pGaZoEQz8bgdf3ZXdrGyRyO9EPmrUKH388ceSpClTpmjBggVKSkrShAkTNGnSpIAHiG/1G/q1HphxSEvntlHe4Cu079MkzVm2T6kt618yF9Hl7Ok4XXblGY154svzPv/iTJe2rnfqkecP6KUNn+nW0ce04NF2+vBdviUSC/jdhhV+J/IJEyZo7NixkqSBAwfqs88+07Jly7Rjxw6NGzfOr2MVFRVpyJAhcrlcMgxDK1eu9DccWxnxwHGtWZam915L04HdSZo/uZ2qzhgafOeJcIcGi3r+2yndO/mw+uSUnff5T7c200/+/YSyr69Qm4xq3XzX/+myrDMqKW4a4kgRDPxuh0iMLnbzO5F/V4cOHTRixAhdddVVfu9bWVmp7OxsLViwwGoYMS+hiUc/uuq0tm9M8Y6ZpqEdG1OU1YMWXKzLurZSW95L1fGvmsg0peK/NNfBfQ716Hcq3KHBIn63YVWDVq3Pnz+/wQesq9YbIicnRzk5OQ1+vZ0509yKT5BOHvP9yL4+nqCMjlVhigqh8tDjB/XcIxka2eNKxSeYioszNe6ZUnX7f5XhDg0W8bsdOoYs3v0sYJEEVoMS+bPPPtuggxmG4Vci91dVVZWqqr79wS4vLw/auYBI8tYrrfTZtqaaVbhP6e2q9Y8tzbXgV+3UsnWNrulbEe7wAIRRgxJ53Sr1cCsoKNCsWbPCHUZYlJ+Il7tWuujiWp/xFq1q9fUxS1faRYSrOmOo8Mm2mv67z9Vr4Lk/Xi/LOqt9/0zWHxelk8ijHL/bIRSjN02xPEceSlOnTlVZWZl3Ky0tDXdIIVNbE6fdf2+qq2/4dk7UMEx1v6FCn25jwVMsq601VFsTp7g4355gXLwp0xOmoBAw/G6HUIwudouqP/ccDoccDke4wwibN3/bShPnlWrXx01VsqOpbh19TElNPXpveVq4Q4NFZyrjdGj/tz/bh0sTtfeTZKVcVKv0djW6qneFXprtUmLSQbVuV62/f9hc//vHND0w42AYo0ag8LsNK6IqkdvdhlUtlNrSrXsmHVaLi2u175/JenRkpk4ebxLu0GDRro+b6pHbOnofvzjzEknST24/oYnzDmjqws/1yhNt9dSY9jp1MkHpl1Tr3slf6af3/F+4QkYA8bsdItzGNPAqKiq0Z88e7+P9+/eruLhYaWlpat++fRgji1yrFrfSqsWtwh0GAiz7+gq9e6j4gs+npddq4jz7TCXZEb/bwWf16myRemW3sCbyrVu3asCAAd7H+fn5kqTc3FwVFhaGKSoAAKJHoxa7bdy4UXfddZd69+6tgwfPzdH9/ve/16ZNm/w6Tv/+/WWaZr2NJA4ACLgYXezmdyJ/4403NHjwYCUnJ2vHjh3e73WXlZXpiSeeCHiAAAAEBIn8nMcff1yLFi3SSy+9pCZNvl2I0adPH23fvj2gwQEAgO/n9xx5SUmJ+vbtW288NTVVJ0+eDERMAAAEXKwudvO7Im/Tpo3PSvM6mzZt0mWXXRaQoAAACLi6K7tZ2SKQ34l89OjRGjdunD766CMZhqFDhw5p6dKlmjhxon7xi18EI0YAAKyL0Tlyv1vrU6ZMkcfj0Y9//GOdPn1affv2lcPh0MSJE/Xwww8HI0YAAHABfidywzD06KOPatKkSdqzZ48qKiqUlZWl5s2bByM+AAACIlbnyBt9QZjExERlZWUFMhYAAIKHS7SeM2DAABnGhSf833//fUsBAQCAhvN7sVv37t2VnZ3t3bKyslRdXa3t27erW7duwYgRAADrzG/b643Z/K3I3W63pk2bpszMTCUnJ+vyyy/X7NmzZZqBLe39rsifffbZ847PnDlTFRUVlgMCACAoQtxaf+qpp7Rw4UK9+uqruvLKK7V161aNGjVKqampGjt2rIVAfDXqWuvnc9ddd+mVV14J1OEAAIhqmzdv1rBhw3TLLbfo0ksv1W233aZBgwbpr3/9a0DPE7BE/uGHHyopKSlQhwMAILAC9D3y8vJyn63uniPfdf3112vdunXatWuXJOnjjz/Wpk2blJOTE9C35XdrfcSIET6PTdPUV199pa1bt2ratGkBCwwAgEAK1NfPMjIyfMZnzJihmTNn1nv9lClTVF5ers6dOys+Pl5ut1tz5szRyJEjGx/EefidyFNTU30ex8XFqVOnTnrsscc0aNCggAUGAEAkKi0tldPp9D52OBznfd3rr7+upUuXatmyZbryyitVXFys8ePHy+VyKTc3N2Dx+JXI3W63Ro0apW7duqlFixYBCwIAgGjhdDp9EvmFTJo0SVOmTNHPfvYzSVK3bt30xRdfqKCgIKCJ3K858vj4eA0aNIi7nAEAok+Ir7V++vRpxcX5ptn4+Hh5PB4Lb6I+v1vrXbt21b59+5SZmRnQQAAACKZQX6J1yJAhmjNnjtq3b68rr7xSO3bs0Ny5c3Xfffc1Pojz8DuRP/7445o4caJmz56tHj16qFmzZj7PN6TdAABArHv++ec1bdo0PfTQQzp69KhcLpf+8z//U9OnTw/oeRqcyB977DH98pe/1M033yxJGjp0qM+lWk3TlGEYcrvdAQ0QAICACeH10lNSUjRv3jzNmzcvqOdpcCKfNWuWHnzwQX3wwQfBjAcAgOCw+01T6q4N269fv6AFAwAA/OPXHPn33fUMAIBIxv3IJV1xxRU/mMxPnDhhKSAAAILC7q116dw8+Xev7AYAAMLHr0T+s5/9TOnp6cGKBQCAoLF9a535cQBAVIvR1nqDL9Fat2odAABEjgZX5IG+NiwAACEVoxW535doBQAgGtl+jhwAgKgWoxW5X7cxBQAAkYWKHABgDzFakZPIAQC2EKtz5LTWAQCIYlTkAAB7oLUOAED0orUOAAAiDhU5AMAeaK0DABDFYjSR01oHACCKUZEDAGzB+Gazsn8kIpEDAOwhRlvrJHIAgC3w9TMAABBxqMgBAPZAax0AgCgXocnYClrrAABEMSpyAIAtxOpiNxI5AMAeYnSOnNY6AABBcvDgQd11111q2bKlkpOT1a1bN23dujWg56AiBwDYQqhb619//bX69OmjAQMG6M9//rMuvvhi7d69Wy1atGh8EOdBIgcA2EOIW+tPPfWUMjIytHjxYu9YZmamhQDOj9Y6AABBsGrVKl177bX693//d6Wnp+vqq6/WSy+9FPDzUJEjagx2dQ93CAih5A2twx0CQqCmslrKCc25AtVaLy8v9xl3OBxyOBz1Xr9v3z4tXLhQ+fn5+tWvfqW//e1vGjt2rBITE5Wbm9v4QL6DihwAYA9mADZJGRkZSk1N9W4FBQXnPZ3H49E111yjJ554QldffbUeeOABjR49WosWLQro26IiBwDYQ4DmyEtLS+V0Or3D56vGJalt27bKysryGevSpYveeOMNC0HURyIHAMAPTqfTJ5FfSJ8+fVRSUuIztmvXLnXo0CGg8dBaBwDYQt0cuZXNHxMmTNCWLVv0xBNPaM+ePVq2bJl++9vfKi8vL6Dvi0QOALCHAM2RN1TPnj21YsUK/eEPf1DXrl01e/ZszZs3TyNHjgzM+/kGrXUAAILkpz/9qX76058G9RwkcgCALRimKcNs/Go3K/sGE4kcAGAP3DQFAABEGipyAIAtcD9yAACiGa11AAAQaajIAQC2QGsdAIBoFqOtdRI5AMAWYrUiZ44cAIAoRkUOALAHWusAAES3SG2PW0FrHQCAKEZFDgCwB9M8t1nZPwKRyAEAtsCqdQAAEHGoyAEA9sCqdQAAopfhObdZ2T8S0VoHACCKUZEDAOyB1joAANErVletk8gBAPYQo98jZ44cAIAoRkUOALAFWusAAESzGF3sRmsdAIAoRkUOALAFWusAAEQzVq0DAIBIQ0UOALCFWG2tU5EDAOzBDMDWSE8++aQMw9D48eMbf5ALIJEDABBEf/vb3/Tiiy/qqquuCsrxSeQAAFuoa61b2fxVUVGhkSNH6qWXXlKLFi0C/6ZEIgcA2IXHtL75KS8vT7fccosGDhwYhDd0DovdAAD2EKAru5WXl/sMOxwOORyOei9fvny5tm/frr/97W8WTvrDqMgBAPBDRkaGUlNTvVtBQUG915SWlmrcuHFaunSpkpKSghoPFTkAwBYMWfz62Tf/LS0tldPp9I6frxrftm2bjh49qmuuucY75na7VVRUpBdeeEFVVVWKj49vfDD/gkQOALCHAF3Zzel0+iTy8/nxj3+sf/zjHz5jo0aNUufOnTV58uSAJXGJRA4AQMClpKSoa9euPmPNmjVTy5Yt641bRSIHANhCrF7ZjUQOALCHMN+PfP369dYOcAGsWgcAIIpRkQMAbMEwTRkWFrtZ2TeYSOQAAHvwfLNZ2T8C0VoHACCKUZEDAGyB1joAANEszKvWg4VEDgCwhwBd2S3SMEcOAEAUoyIHANgCV3ZDRBhy73Hd9oujSru4Vvs+TdZ//9clKiluGu6wEAR81rHJ/XG1av9QKc+uWun/PEp8PFXxN357m8uaxRVyv39W5lG3lGAorlMTNbm/ueKymoQx6hhBaz3wCgoK1LNnT6WkpCg9PV3Dhw9XSUlJOEOKaP2Gfq0HZhzS0rltlDf4Cu37NElzlu1TasuacIeGAOOzjmFnTMV1bKLE8SnnfdpoF68m41LkWNxSjhfSZLSJU9XEr2WejNAvMSPswprIN2zYoLy8PG3ZskVr165VTU2NBg0apMrKynCGFbFGPHBca5al6b3X0nRgd5LmT26nqjOGBt95ItyhIcD4rGNX/P9zqMn9zRXfN+m8zyf8JFnx1zoU50pQXGaCmuSlSJWmPHv5I84qw2N9i0Rhba2vWbPG53FhYaHS09O1bds29e3bN0xRRaaEJh796KrTWv5CunfMNA3t2JiirB6nwxgZAo3PGnXMGlO1b5+RmhuKu5zWumUx2lqPqDnysrIySVJaWtp5n6+qqlJVVZX3cXl5eUjiigTONLfiE6STx3w/sq+PJyijY9UF9kI04rOGe3OVqh8rk86aUss4OX7dQsZFfMkI5xcxPxkej0fjx49Xnz59LnjT9YKCAqWmpnq3jIyMEEcJAMEXd3WiHC+nybGgheKvS1T1zJMyv47Qvm40MQOwRaCISeR5eXn65JNPtHz58gu+ZurUqSorK/NupaWlIYwwvMpPxMtdK110ca3PeItWtfr6WEQ1VmARnzWMZENx7RIUd2WiEienSvGGat85E+6wol7dJVqtbJEoIhL5mDFjtHr1an3wwQdq167dBV/ncDjkdDp9NruorYnT7r831dU3nPKOGYap7jdU6NNtfCUplvBZox5TUk1kJhGEX1j/vDdNUw8//LBWrFih9evXKzMzM5zhRLw3f9tKE+eVatfHTVWyo6luHX1MSU09em/5+dcUIHrxWccu87RH5kH3t4+/csuzu0Zyxslwxqn29xWK7+OQWsZLZR7Vrjgt87hb8f3Pv8odfmCxW+Dl5eVp2bJleuutt5SSkqLDhw9LklJTU5WcnBzO0CLShlUtlNrSrXsmHVaLi2u175/JenRkpk4eZzVrrOGzjl2eklpVj//a+7hmQYUkKf6mJDXJd8pzwK3ad8ukMo/kjFNc5yZyzE9TXCbTKpaZsnZP8cjM4zJMM3x/YhiGcd7xxYsX69577/3B/cvLy5Wamqr+GqYEg3/ggFiSvKF1uENACNRUVmtNzksqKysL2nRpXa74t6unKCG+8Z2NWvdZvb/jyaDG2hhhb60DAIDGo1cDALAHUxbnyAMWSUCRyAEA9hCji90i4utnAACgcajIAQD24JF0/jXWDd8/ApHIAQC2YPXqbFzZDQAABBwVOQDAHmJ0sRuJHABgDzGayGmtAwAQxajIAQD2QEUOAEAU8wRg80NBQYF69uyplJQUpaena/jw4SopKQnMe/kXJHIAgC3Uff3MyuaPDRs2KC8vT1u2bNHatWtVU1OjQYMGqbKyMqDvi9Y6AABBsGbNGp/HhYWFSk9P17Zt29S3b9+AnYdEDgCwhwDNkZeXl/sMOxwOORyOH9y9rKxMkpSWltb4GM6D1joAwB48pvVNUkZGhlJTU71bQUHBD5/a49H48ePVp08fde3aNaBvi4ocAAA/lJaWyul0eh83pBrPy8vTJ598ok2bNgU8HhI5AMAeAtRadzqdPon8h4wZM0arV69WUVGR2rVr1/jzXwCJHABgExYTufzb1zRNPfzww1qxYoXWr1+vzMxMC+e+MBI5AABBkJeXp2XLlumtt95SSkqKDh8+LElKTU1VcnJywM7DYjcAgD3UtdatbH5YuHChysrK1L9/f7Vt29a7vfbaawF9W1TkAAB78Jjytz1ef/+GM0N0SVcqcgAAohgVOQDAHkzPuc3K/hGIRA4AsIcYvfsZiRwAYA8hniMPFebIAQCIYlTkAAB7oLUOAEAUM2UxkQcskoCitQ4AQBSjIgcA2AOtdQAAopjHI8nCd8E9kfk9clrrAABEMSpyAIA90FoHACCKxWgip7UOAEAUoyIHANhDjF6ilUQOALAF0/TItHAHMyv7BhOJHABgD6ZprapmjhwAAAQaFTkAwB5Mi3PkEVqRk8gBAPbg8UiGhXnuCJ0jp7UOAEAUoyIHANgDrXUAAKKX6fHItNBaj9Svn9FaBwAgilGRAwDsgdY6AABRzGNKRuwlclrrAABEMSpyAIA9mKYkK98jj8yKnEQOALAF02PKtNBaN0nkAACEkemRtYqcr58BAGA7CxYs0KWXXqqkpCT16tVLf/3rXwN6fBI5AMAWTI9pefPXa6+9pvz8fM2YMUPbt29Xdna2Bg8erKNHjwbsfZHIAQD2YHqsb36aO3euRo8erVGjRikrK0uLFi1S06ZN9corrwTsbUX1HHndwoNa1Vj6jj+AyFNTWR3uEBACtd98zqFYSGY1V9SqRpJUXl7uM+5wOORwOOq9vrq6Wtu2bdPUqVO9Y3FxcRo4cKA+/PDDxgfyHVGdyE+dOiVJ2qQ/hTkSAAGXE+4AEEqnTp1SampqUI6dmJioNm3aaNNh67miefPmysjI8BmbMWOGZs6cWe+1x48fl9vtVuvWrX3GW7durc8++8xyLHWiOpG7XC6VlpYqJSVFhmGEO5yQKS8vV0ZGhkpLS+V0OsMdDoKIz9o+7PpZm6apU6dOyeVyBe0cSUlJ2r9/v6qrrXd5TNOsl2/OV42HUlQn8ri4OLVr1y7cYYSN0+m01S+8nfFZ24cdP+tgVeL/KikpSUlJSUE/z79q1aqV4uPjdeTIEZ/xI0eOqE2bNgE7D4vdAAAIgsTERPXo0UPr1q3zjnk8Hq1bt069e/cO2HmiuiIHACCS5efnKzc3V9dee62uu+46zZs3T5WVlRo1alTAzkEij0IOh0MzZswI+7wMgo/P2j74rGPTHXfcoWPHjmn69Ok6fPiwunfvrjVr1tRbAGeFYUbqxWMBAMAPYo4cAIAoRiIHACCKkcgBAIhiJHIAAKIYiTzKBPt2eIgMRUVFGjJkiFwulwzD0MqVK8MdEoKkoKBAPXv2VEpKitLT0zV8+HCVlJSEOyxEERJ5FAnF7fAQGSorK5Wdna0FCxaEOxQE2YYNG5SXl6ctW7Zo7dq1qqmp0aBBg1RZWRnu0BAl+PpZFOnVq5d69uypF154QdK5KwRlZGTo4Ycf1pQpU8IcHYLFMAytWLFCw4cPD3coCIFjx44pPT1dGzZsUN++fcMdDqIAFXmUqLsd3sCBA71jwbgdHoDwKisrkySlpaWFORJECxJ5lPi+2+EdPnw4TFEBCCSPx6Px48erT58+6tq1a7jDQZTgEq0AECHy8vL0ySefaNOmTeEOBVGERB4lQnU7PADhMWbMGK1evVpFRUW2vj0z/EdrPUqE6nZ4AELLNE2NGTNGK1as0Pvvv6/MzMxwh4QoQ0UeRUJxOzxEhoqKCu3Zs8f7eP/+/SouLlZaWprat28fxsgQaHl5eVq2bJneeustpaSkeNe8pKamKjk5OczRIRrw9bMo88ILL+iZZ57x3g5v/vz56tWrV7jDQoCtX79eAwYMqDeem5urwsLC0AeEoDEM47zjixcv1r333hvaYBCVSOQAAEQx5sgBAIhiJHIAAKIYiRwAgChGIgcAIIqRyAEAiGIkcgAAohiJHACAKEYiByy69957fe4V3r9/f40fPz7kcaxfv16GYejkyZMXfI1hGFq5cmWDjzlz5kx1797dUlyff/65DMNQcXGxpeMAOD8SOWLSvffeK8MwZBiGEhMT1bFjRz322GOqra0N+rnffPNNzZ49u0GvbUjyBYDvw7XWEbNuuukmLV68WFVVVfrTn/6kvLw8NWnSRFOnTq332urqaiUmJgbkvGlpaQE5DgA0BBU5YpbD4VCbNm3UoUMH/eIXv9DAgQO1atUqSd+2w+fMmSOXy6VOnTpJkkpLS3X77bfroosuUlpamoYNG6bPP//ce0y32638/HxddNFFatmypR555BF99yrH322tV1VVafLkycrIyJDD4VDHjh31u9/9Tp9//rn3euotWrSQYRjea2t7PB4VFBQoMzNTycnJys7O1h//+Eef8/zpT3/SFVdcoeTkZA0YMMAnzoaaPHmyrrjiCjVt2lSXXXaZpk2bppqamnqve/HFF5WRkaGmTZvq9ttvV1lZmc/zL7/8srp06aKkpCR17txZ//3f/+13LAAah0QO20hOTlZ1dbX38bp161RSUqK1a9dq9erVqqmp0eDBg5WSkqKNGzfqL3/5i5o3b66bbrrJu99vfvMbFRYW6pVXXtGmTZt04sQJrVix4nvPe8899+gPf/iD5s+fr507d+rFF19U8+bNlZGRoTfeeEOSVFJSoq+++krPPfecJKmgoEBLlizRokWL9M9//lMTJkzQXXfdpQ0bNkg69wfHiBEjNGTIEBUXF+v+++/XlClT/P7/JCUlRYWFhfr000/13HPP6aWXXtKzzz7r85o9e/bo9ddf19tvv601a9Zox44deuihh7zPL126VNOnT9ecOXO0c+dOPfHEE5o2bZpeffVVv+MB0AgmEINyc3PNYcOGmaZpmh6Px1y7dq3pcDjMiRMnep9v3bq1WVVV5d3n97//vdmpUyfT4/F4x6qqqszk5GTz3XffNU3TNNu2bWs+/fTT3udramrMdu3aec9lmqbZr18/c9y4caZpmmZJSYkpyVy7du154/zggw9MSebXX3/tHTt79qzZtGlTc/PmzT6v/fnPf27eeeedpmma5tSpU82srCyf5ydPnlzvWN8lyVyxYsUFn3/mmWfMHj16eB/PmDHDjI+PN7/88kvv2J///GczLi7O/Oqrr0zTNM3LL7/cXLZsmc9xZs+ebfbu3ds0TdPcv3+/KcncsWPHBc8LoPGYI0fMWr16tZo3b66amhp5PB79x3/8h2bOnOl9vlu3bj7z4h9//LH27NmjlJQUn+OcPXtWe/fuVVlZmb766iuf28YmJCTo2muvrdder1NcXKz4+Hj169evwXHv2bNHp0+f1k9+8hOf8erqal199dWSpJ07d9a7fW3v3r0bfI46r732mubPn6+9e/eqoqJCtbW1cjqdPq9p3769LrnkEp/zeDwelZSUKCUlRXv37tXPf/5zjR492vua2tpapaam+h0PAP+RyBGzBgwYoIULFyoxMVEul0sJCb4/7s2aNfN5XFFRoR49emjp0qX1jnXxxRc3Kobk5GS/96moqJAkvfPOOz4JVDo37x8oH374oUaOHKlZs2Zp8ODBSk1N1fLly/Wb3/zG71hfeumlen9YxMfHByxWABdGIkfMatasmTp27Njg119zzTV67bXXlJ6eXq8qrdO2bVt99NFH6tu3r6Rzlee2bdt0zTXXnPf13bp1k8fj0YYNGzRw4MB6z9d1BNxut3csKytLDodDBw4cuGAl36VLF+/CvTpbtmz54Tf5LzZv3qwOHTro0Ucf9Y598cUX9V534MABHTp0SC6Xy3ueuLg4derUSa1bt5bL5dK+ffs0cuRIv84PIDBY7AZ8Y+TIkWrVqpWGDRumjRs3av/+/Vq/fr3Gjh2rL7/8UpI0btw4Pfnkk1q5cqU+++wzPfTQQ9/7HfBLL71Uubm5uu+++7Ry5UrvMV9//XVJUocOHWQYhlavXq1jx46poqJCKSkpmjhxoiZMmKBXX31Ve/fu1fbt2/X88897F5A9+OCD2r17tyZNmqSSkhItW7ZMhYWFfr3fH/3oRzpw4ICWL1+uvXv3av78+edduJeUlKTc3Fx9/PHH2rhxo8aOHavbb79dbdq0kSTNmjVLBQUFmj9/vnbt2qV//OMfWrx4sebOnetXPAAah0QOfKNp06YqKipS+/btNWLECHXp0kU///nPdfbsWW+F/stf/lJ33323cnNz1bt3b6WkpOjWW2/93uMuXLhQt912mx566CF17txZo0ePVmVlpSTpkksu0axZszRlyhS1bt1aY8aMkSTNnj1b06ZNU0FBgbp06aKbbrpJ77zzjjIzMyWdm7d+4403tHLlSmVnZ2vRokV64okn/Hq/Q4cO1YQJEzRmzBh1795dmzdv1rRp0+q9rmPHjhoxYoRuvvlmDRo0SFdddZXP18vuv/9+vfzyy1q8eLG6deumfv36qbCw0BsrgOAyzAut0gEAABGPihwAgChGIgcAIIqRyAEAiGIkcgAAohiJHACAKEYiBwAgipHIAQCIYiRyAACiGIkcAIAoRiIHACCKkcgBAIhiJHIAAKLY/wcJU52GbwLgagAAAABJRU5ErkJggg==",
      "text/plain": [
       "<Figure size 640x480 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "print(confusion_matrix(y_test,predictions))\n",
    "disp = ConfusionMatrixDisplay(confusion_matrix=confusion_matrix(y_test,predictions), display_labels=['0','1','2'])\n",
    "disp.plot()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "bd5a17f2-9fef-4b9e-bb1a-90cae20d20d4",
   "metadata": {},
   "source": [
    "# 用鸢尾花数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "3a6fd7c4-6867-44c1-bfe0-f72e055ada68",
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn import datasets\n",
    "iris = datasets.load_iris()\n",
    "X_iris=iris.data\n",
    "y_iris=iris.target"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "dbfed50f-dfe5-4e57-8c20-b4eca98c9ced",
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.model_selection import train_test_split\n",
    "X_train, X_test, y_train, y_test = train_test_split(X_iris, y_iris)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "3b0ffb05-1f69-4a92-85b9-7adb2478868a",
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.preprocessing import StandardScaler\n",
    "scaler = StandardScaler()\n",
    "X_scaled = scaler.fit(X_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "fef90827-94b3-44ac-9603-816deedd0317",
   "metadata": {},
   "outputs": [],
   "source": [
    "X_train = scaler.transform(X_train)\n",
    "X_test = scaler.transform(X_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "4f0ac7c6-c47b-4907-b9c0-3e7670043b64",
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.neural_network import MLPClassifier\n",
    "mlp = MLPClassifier(hidden_layer_sizes=(4,4),activation='relu',max_iter=500)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "6046bf27-7bbe-451f-9b08-fb662c05909e",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/software/commom_envs/pub_jupyter/lib/python3.10/site-packages/sklearn/neural_network/_multilayer_perceptron.py:690: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (500) reached and the optimization hasn't converged yet.\n",
      "  warnings.warn(\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<style>#sk-container-id-2 {\n",
       "  /* Definition of color scheme common for light and dark mode */\n",
       "  --sklearn-color-text: black;\n",
       "  --sklearn-color-line: gray;\n",
       "  /* Definition of color scheme for unfitted estimators */\n",
       "  --sklearn-color-unfitted-level-0: #fff5e6;\n",
       "  --sklearn-color-unfitted-level-1: #f6e4d2;\n",
       "  --sklearn-color-unfitted-level-2: #ffe0b3;\n",
       "  --sklearn-color-unfitted-level-3: chocolate;\n",
       "  /* Definition of color scheme for fitted estimators */\n",
       "  --sklearn-color-fitted-level-0: #f0f8ff;\n",
       "  --sklearn-color-fitted-level-1: #d4ebff;\n",
       "  --sklearn-color-fitted-level-2: #b3dbfd;\n",
       "  --sklearn-color-fitted-level-3: cornflowerblue;\n",
       "\n",
       "  /* Specific color for light theme */\n",
       "  --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, white)));\n",
       "  --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-icon: #696969;\n",
       "\n",
       "  @media (prefers-color-scheme: dark) {\n",
       "    /* Redefinition of color scheme for dark theme */\n",
       "    --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, #111)));\n",
       "    --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-icon: #878787;\n",
       "  }\n",
       "}\n",
       "\n",
       "#sk-container-id-2 {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 pre {\n",
       "  padding: 0;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 input.sk-hidden--visually {\n",
       "  border: 0;\n",
       "  clip: rect(1px 1px 1px 1px);\n",
       "  clip: rect(1px, 1px, 1px, 1px);\n",
       "  height: 1px;\n",
       "  margin: -1px;\n",
       "  overflow: hidden;\n",
       "  padding: 0;\n",
       "  position: absolute;\n",
       "  width: 1px;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-dashed-wrapped {\n",
       "  border: 1px dashed var(--sklearn-color-line);\n",
       "  margin: 0 0.4em 0.5em 0.4em;\n",
       "  box-sizing: border-box;\n",
       "  padding-bottom: 0.4em;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-container {\n",
       "  /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n",
       "     but bootstrap.min.css set `[hidden] { display: none !important; }`\n",
       "     so we also need the `!important` here to be able to override the\n",
       "     default hidden behavior on the sphinx rendered scikit-learn.org.\n",
       "     See: https://github.com/scikit-learn/scikit-learn/issues/21755 */\n",
       "  display: inline-block !important;\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-text-repr-fallback {\n",
       "  display: none;\n",
       "}\n",
       "\n",
       "div.sk-parallel-item,\n",
       "div.sk-serial,\n",
       "div.sk-item {\n",
       "  /* draw centered vertical line to link estimators */\n",
       "  background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));\n",
       "  background-size: 2px 100%;\n",
       "  background-repeat: no-repeat;\n",
       "  background-position: center center;\n",
       "}\n",
       "\n",
       "/* Parallel-specific style estimator block */\n",
       "\n",
       "#sk-container-id-2 div.sk-parallel-item::after {\n",
       "  content: \"\";\n",
       "  width: 100%;\n",
       "  border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n",
       "  flex-grow: 1;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-parallel {\n",
       "  display: flex;\n",
       "  align-items: stretch;\n",
       "  justify-content: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-parallel-item {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-parallel-item:first-child::after {\n",
       "  align-self: flex-end;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-parallel-item:last-child::after {\n",
       "  align-self: flex-start;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-parallel-item:only-child::after {\n",
       "  width: 0;\n",
       "}\n",
       "\n",
       "/* Serial-specific style estimator block */\n",
       "\n",
       "#sk-container-id-2 div.sk-serial {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "  align-items: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  padding-right: 1em;\n",
       "  padding-left: 1em;\n",
       "}\n",
       "\n",
       "\n",
       "/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is\n",
       "clickable and can be expanded/collapsed.\n",
       "- Pipeline and ColumnTransformer use this feature and define the default style\n",
       "- Estimators will overwrite some part of the style using the `sk-estimator` class\n",
       "*/\n",
       "\n",
       "/* Pipeline and ColumnTransformer style (default) */\n",
       "\n",
       "#sk-container-id-2 div.sk-toggleable {\n",
       "  /* Default theme specific background. It is overwritten whether we have a\n",
       "  specific estimator or a Pipeline/ColumnTransformer */\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "/* Toggleable label */\n",
       "#sk-container-id-2 label.sk-toggleable__label {\n",
       "  cursor: pointer;\n",
       "  display: block;\n",
       "  width: 100%;\n",
       "  margin-bottom: 0;\n",
       "  padding: 0.5em;\n",
       "  box-sizing: border-box;\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 label.sk-toggleable__label-arrow:before {\n",
       "  /* Arrow on the left of the label */\n",
       "  content: \"▸\";\n",
       "  float: left;\n",
       "  margin-right: 0.25em;\n",
       "  color: var(--sklearn-color-icon);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 label.sk-toggleable__label-arrow:hover:before {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "/* Toggleable content - dropdown */\n",
       "\n",
       "#sk-container-id-2 div.sk-toggleable__content {\n",
       "  max-height: 0;\n",
       "  max-width: 0;\n",
       "  overflow: hidden;\n",
       "  text-align: left;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-toggleable__content.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-toggleable__content pre {\n",
       "  margin: 0.2em;\n",
       "  border-radius: 0.25em;\n",
       "  color: var(--sklearn-color-text);\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-toggleable__content.fitted pre {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 input.sk-toggleable__control:checked~div.sk-toggleable__content {\n",
       "  /* Expand drop-down */\n",
       "  max-height: 200px;\n",
       "  max-width: 100%;\n",
       "  overflow: auto;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n",
       "  content: \"▾\";\n",
       "}\n",
       "\n",
       "/* Pipeline/ColumnTransformer-specific style */\n",
       "\n",
       "#sk-container-id-2 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator-specific style */\n",
       "\n",
       "/* Colorize estimator box */\n",
       "#sk-container-id-2 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-label label.sk-toggleable__label,\n",
       "#sk-container-id-2 div.sk-label label {\n",
       "  /* The background is the default theme color */\n",
       "  color: var(--sklearn-color-text-on-default-background);\n",
       "}\n",
       "\n",
       "/* On hover, darken the color of the background */\n",
       "#sk-container-id-2 div.sk-label:hover label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "/* Label box, darken color on hover, fitted */\n",
       "#sk-container-id-2 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator label */\n",
       "\n",
       "#sk-container-id-2 div.sk-label label {\n",
       "  font-family: monospace;\n",
       "  font-weight: bold;\n",
       "  display: inline-block;\n",
       "  line-height: 1.2em;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-label-container {\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "/* Estimator-specific */\n",
       "#sk-container-id-2 div.sk-estimator {\n",
       "  font-family: monospace;\n",
       "  border: 1px dotted var(--sklearn-color-border-box);\n",
       "  border-radius: 0.25em;\n",
       "  box-sizing: border-box;\n",
       "  margin-bottom: 0.5em;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-estimator.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "/* on hover */\n",
       "#sk-container-id-2 div.sk-estimator:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-estimator.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Specification for estimator info (e.g. \"i\" and \"?\") */\n",
       "\n",
       "/* Common style for \"i\" and \"?\" */\n",
       "\n",
       ".sk-estimator-doc-link,\n",
       "a:link.sk-estimator-doc-link,\n",
       "a:visited.sk-estimator-doc-link {\n",
       "  float: right;\n",
       "  font-size: smaller;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1em;\n",
       "  height: 1em;\n",
       "  width: 1em;\n",
       "  text-decoration: none !important;\n",
       "  margin-left: 1ex;\n",
       "  /* unfitted */\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted,\n",
       "a:link.sk-estimator-doc-link.fitted,\n",
       "a:visited.sk-estimator-doc-link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "div.sk-estimator:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "div.sk-estimator.fitted:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "/* Span, style for the box shown on hovering the info icon */\n",
       ".sk-estimator-doc-link span {\n",
       "  display: none;\n",
       "  z-index: 9999;\n",
       "  position: relative;\n",
       "  font-weight: normal;\n",
       "  right: .2ex;\n",
       "  padding: .5ex;\n",
       "  margin: .5ex;\n",
       "  width: min-content;\n",
       "  min-width: 20ex;\n",
       "  max-width: 50ex;\n",
       "  color: var(--sklearn-color-text);\n",
       "  box-shadow: 2pt 2pt 4pt #999;\n",
       "  /* unfitted */\n",
       "  background: var(--sklearn-color-unfitted-level-0);\n",
       "  border: .5pt solid var(--sklearn-color-unfitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted span {\n",
       "  /* fitted */\n",
       "  background: var(--sklearn-color-fitted-level-0);\n",
       "  border: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link:hover span {\n",
       "  display: block;\n",
       "}\n",
       "\n",
       "/* \"?\"-specific style due to the `<a>` HTML tag */\n",
       "\n",
       "#sk-container-id-2 a.estimator_doc_link {\n",
       "  float: right;\n",
       "  font-size: 1rem;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1rem;\n",
       "  height: 1rem;\n",
       "  width: 1rem;\n",
       "  text-decoration: none;\n",
       "  /* unfitted */\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 a.estimator_doc_link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "#sk-container-id-2 a.estimator_doc_link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 a.estimator_doc_link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "</style><div id=\"sk-container-id-2\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>MLPClassifier(hidden_layer_sizes=(4, 4), max_iter=500)</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-2\" type=\"checkbox\" checked><label for=\"sk-estimator-id-2\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\">&nbsp;&nbsp;MLPClassifier<a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.5/modules/generated/sklearn.neural_network.MLPClassifier.html\">?<span>Documentation for MLPClassifier</span></a><span class=\"sk-estimator-doc-link fitted\">i<span>Fitted</span></span></label><div class=\"sk-toggleable__content fitted\"><pre>MLPClassifier(hidden_layer_sizes=(4, 4), max_iter=500)</pre></div> </div></div></div></div>"
      ],
      "text/plain": [
       "MLPClassifier(hidden_layer_sizes=(4, 4), max_iter=500)"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "mlp.fit(X_train,y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "aeba4183-d445-49e2-9c3f-eeb0224820a2",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[12  0  0]\n",
      " [ 0 10  1]\n",
      " [ 0  0 15]]\n"
     ]
    },
    {
     "data": {
      "image/png": "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JydHS5Ys0QMPPKDS0lLdfvvtOn78uC677DKtW7dOSUlJQd2HRA4A8ATLsjlqPchz+/XrJ+tHTjIMQw899JAeeuihugcl+sgBAHA1KnIAgCfE6qIpJHIAgCeQyAEAcLFwD3YLF/rIAQBwMSpyAIAnhHvUeriQyAEAnnA6kdvpI3cwGAfRtA4AgItRkQMAPIFR6wAAuJil79YUr+v50YimdQAAXIyKHADgCTStAwDgZjHatk4iBwB4g82KXFFakdNHDgCAi1GRAwA8gZndAABwsVgd7EbTOgAALkZFDgDwBsuwN2AtSityEjkAwBNitY+cpnUAAFyMihwA4A1MCAMAgHvF6qj1WiXyNWvW1PqCV199dZ2DAQAAwalVIh82bFitLmYYhvx+v514AAAInShtHrejVoncNM1QxwEAQEjFatO6rVHrZWVlTsUBAEBoWQ5sUSjoRO73+zVz5kydd955atiwofbs2SNJmjJliv70pz85HiAAADi3oBP5rFmztGTJEj322GNKTEwM7O/SpYuef/55R4MDAMA5hgNb9Ak6kS9dulTPPfecRowYofj4+MD+bt266fPPP3c0OAAAHEPT+mlff/212rdvX2O/aZqqrKx0JCgAAFA7QSfyzp07a/PmzTX2//Wvf9XFF1/sSFAAADguRivyoGd2mzp1qnJycvT111/LNE298sorys/P19KlS7V27dpQxAgAgH0xuvpZ0BX50KFD9eqrr+r//u//1KBBA02dOlU7duzQq6++ql/96lehiBEAAJxDneZa/8UvfqH169c7HQsAACETq8uY1nnRlK1bt2rHjh2STveb9+jRw7GgAABwHKufnfbVV1/p+uuv1z/+8Q81atRIknT8+HH9/Oc/14oVK9SyZUunYwQAAOcQdB/5bbfdpsrKSu3YsUNHjx7V0aNHtWPHDpmmqdtuuy0UMQIAYN+ZwW52tigUdCLfuHGjFixYoI4dOwb2dezYUU8//bQ2bdrkaHAAADjFsOxvwfD7/ZoyZYratm2r5ORk/exnP9PMmTNlOdzZHnTTenZ29lknfvH7/crKynIkKAAAHBfmPvJHH31UCxYs0IsvvqgLL7xQW7du1ciRI5WWlqZ77rnHRiDVBV2RP/7447r77ru1devWwL6tW7fq3nvv1X//9387FhgAAG727rvvaujQobrqqqvUpk0bXXPNNRo4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hvbv369ly5bp/vvv15133hmKGAEAwDkE3bQ+adIkmaapX/7ylzp16pQuv/xy+Xw+3X///br77rtDESMAALYxIcy3DMPQgw8+qAkTJmjXrl0qKSlR586d1bBhw1DEBwCAM2L0PfI6TwiTmJiozp07OxkLAAAIUtCJvH///jKMc4/ce+utt2wFBABASNh9hSxWKvLu3btX+1xZWam8vDx9+umnysnJcSouAACcRdP6aU8++eRZ90+fPl0lJSW2AwIAALXn2BqIN9xwg1544QWnLgcAgLNi9D1yx1Y/e++995SUlOTU5QAAcBSvn31r+PDh1T5blqUDBw5o69atmjJlimOBAQCAnxZ0Ik9LS6v2OS4uTh07dtRDDz2kgQMHOhYYAAD4aUElcr/fr5EjR6pr165KT08PVUwAADgvRketBzXYLT4+XgMHDmSVMwCA68TqMqZBj1rv0qWL9uzZE4pYAABAkIJO5A8//LDuv/9+rV27VgcOHFBxcXG1DQCAqBVjr55JQfSRP/TQQ7rvvvv061//WpJ09dVXV5uq1bIsGYYhv9/vfJQAANgVo33ktU7kM2bM0B133KG33347lPEAAIAg1DqRW9bpP0WuuOKKkAUDAECoMCGM9KOrngEAENW83rQuSR06dPjJZH706FFbAQEAgNoLKpHPmDGjxsxuAAC4AU3rkq677jo1a9YsVLEAABA6EWha//rrrzVx4kS98cYbOnXqlNq3b6/FixerZ8+eNgKprtaJnP5xAABq79ixY+rbt6/69++vN954Q02bNtXOnTsdn+I86FHrAAC4Upgr8kcffVTZ2dlavHhxYF/btm1tBHB2tZ7ZzTRNmtUBAK7l1FzrP5zRtLy8/Kz3W7NmjXr27Kn//M//VLNmzXTxxRdr0aJFjv+uoKdoBQDAlexMz/q9aj47O1tpaWmBLTc396y327NnjxYsWKDzzz9fb775pu68807dc889evHFFx39WUGvRw4AgJcVFhYqNTU18Nnn8531ONM01bNnT82ePVuSdPHFF+vTTz/VwoULlZOT41g8VOQAAG9wqCJPTU2ttp0rkbdo0UKdO3eutq9Tp07at2+foz+LihwA4Anhfo+8b9++ys/Pr7bviy++UOvWresexFlQkQMAEALjxo3T+++/r9mzZ2vXrl1avny5nnvuOY0ePdrR+5DIAQDe4FDTem31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fHy8rrjiilrHvWvXLp06dUq/+tWvqu2vqKjQxRdfLEnasWNHjXXo+/TpU+t7nLFy5UrNmzdPu3fvVklJiaqqqpSamlrtmFatWum8886rdh/TNJWfn6+UlBTt3r1bt956q0aNGhU4pqqqSmlpaUHHAyB4JHLErP79+2vBggVKTExUVlaWEhKq/+veoEGDap9LSkrUo0cPLVu2rMa1mjZtWqcYkpOTgz6npKREkvTaa69VS6DS6X5/p7z33nsaMWKEZsyYoUGDBiktLU0rVqzQE088EXSsixYtqvGHRXx8vGOxAjg3EjliVoMGDdS+fftaH3/JJZdo5cqVatasWY2q9IwWLVrogw8+0OWXXy7pdOW5bds2XXLJJWc9vmvXrjJNUxs3btSAAQNqfH+mRcDv9wf2de7cWT6fT/v27TtnJd+pU6fAwL0z3n///Z/+kd/z7rvvqnXr1nrwwQcD+7788ssax+3bt0/79+9XVlZW4D5xcXHq2LGjmjdvrqysLO3Zs0cjRowI6v4AnMFgN+BbI0aMUJMmTTR06FBt3rxZBQUFeuedd3TPPffoq6++kiTde++9euSRR7R69Wp9/vnnuuuuu370HfA2bdooJydHt9xyi1avXh245ksvvSRJat26tQzD0Nq1a3X48GGVlJQoJSVF999/v8aNG6cXX3xRu3fv1vbt2/X0008HBpDdcccd2rlzpyZMmKD8/HwtX75cS5YsCer3nn/++dq3b59WrFih3bt3a968eWcduJeUlKScnBx9/PHH2rx5s+655x5de+21yszMlCTNmDFDubm5mjdvnr744gt98sknWrx4sebMmRNUPADqhkQOfKt+/fratGmTWrVqpeHDh6tTp0669dZbVVZWFqjQ77vvPt14443KyclRnz59lJKSot/+9rc/et0FCxbommuu0V133aULLrhAo0aNUmlpqSTpvPPO04wZMzRp0iQ1b95cY8aMkSTNnDlTU6ZMUW5urjp16qQrr7xSr732mtq2bSvpdL/1yy+/rNWrV6tbt25auHChZs+eHdTvvfrqqzVu3DiNGTNG3bt317vvvqspU6bUOK59+/YaPny4fv3rX2vgwIG66KKLqr1edtttt+n555/X4sWL1bVrV11xxRVasmRJIFYAoWVY5xqlAwAAoh4VOQAALkYiBwDAxUjkAAC4GIkcAAAXI5EDAOBiJHIAAFyMRA4AgIuRyAEAcDESOQAALkYiBwDAxUjkAAC42P8HlR4xSH3YATsAAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 640x480 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "from sklearn.metrics import classification_report,confusion_matrix, ConfusionMatrixDisplay\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "predictions = mlp.predict(X_test)\n",
    "print(confusion_matrix(y_test,predictions))\n",
    "disp = ConfusionMatrixDisplay(confusion_matrix=confusion_matrix(y_test,predictions), display_labels=['0','1','2'])\n",
    "disp.plot()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "abee9b7a-54c9-4141-ad6f-35bda35cf59f",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.14"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
